1.1简介
![排序04--[快速排序&&希尔排序] 排序04--[快速排序&&希尔排序]](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9YUhSMGNITTZMeTlwYldjeU1ESXdMbU51WW14dlozTXVZMjl0TDJKc2IyY3ZNVE0wTVRZMk1pOHlNREl3TURNdk1UTTBNVFkyTWkweU1ESXdNRE15TlRFd01Ua3dOREUwTmkweE56RTFNamt4T1RjM0xuQnVadz09)
1.2执行流程
![排序04--[快速排序&&希尔排序] 排序04--[快速排序&&希尔排序]](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9YUhSMGNITTZMeTlwYldjeU1ESXdMbU51WW14dlozTXVZMjl0TDJKc2IyY3ZNVE0wTVRZMk1pOHlNREl3TURNdk1UTTBNVFkyTWkweU1ESXdNRE15TlRFd01Ua3pNREV6TmkweU1EazBOREk1TVRVdWNHNW4=)
1.3快速排序--轴点的构造
![排序04--[快速排序&&希尔排序] 排序04--[快速排序&&希尔排序]](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9YUhSMGNITTZMeTlwYldjeU1ESXdMbU51WW14dlozTXVZMjl0TDJKc2IyY3ZNVE0wTVRZMk1pOHlNREl3TURNdk1UTTBNVFkyTWkweU1ESXdNRE15TlRFd01qRXdOVGN6TkMweE56ZzFNVEV3TVRjd0xuQnVadz09)
1.4快速排序--时间复杂度
![排序04--[快速排序&&希尔排序] 排序04--[快速排序&&希尔排序]](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9YUhSMGNITTZMeTlwYldjeU1ESXdMbU51WW14dlozTXVZMjl0TDJKc2IyY3ZNVE0wTVRZMk1pOHlNREl3TURNdk1UTTBNVFkyTWkweU1ESXdNRE15TlRFd01qRTBOVE16T1MwMU5UY3hOakU0TURndWNHNW4=)
1.5快速排序--实现
![排序04--[快速排序&&希尔排序] 排序04--[快速排序&&希尔排序]](/default/index/img?u=L2RlZmF1bHQvaW5kZXgvaW1nP3U9YUhSMGNITTZMeTlwYldjeU1ESXdMbU51WW14dlozTXVZMjl0TDJKc2IyY3ZNVE0wTVRZMk1pOHlNREl3TURNdk1UTTBNVFkyTWkweU1ESXdNRE15TlRFd01qSXhOakUzT1MweU16azNNekUxTkRndWNHNW4=)
![]()
@Override
protected void sort() {
sort(0, array.length);
}
/**
* 对 [begin, end) 范围的元素进行快速排序
* @param begin
* @param end
*/
private void sort(int begin, int end) {
if (end - begin < 2) return;
// 确定轴点位置 O(n)
int mid = pivotIndex(begin, end);
// 对子序列进行快速排序
sort(begin, mid);
sort(mid + 1, end);
}
/**
* 构造出 [begin, end) 范围的轴点元素
* @return 轴点元素的最终位置
*/
private int pivotIndex(int begin, int end) {
// 随机选择一个元素跟begin位置进行交换
swap(begin, begin + (int)(Math.random() * (end - begin)));
// 备份begin位置的元素
T pivot = array[begin];
// end指向最后一个元素
end--;
while (begin < end) {
while (begin < end) {
if (cmp(pivot, array[end]) < 0) { // 右边元素 > 轴点元素
end--;
} else { // 右边元素 <= 轴点元素
array[begin++] = array[end];
break;
}
}
while (begin < end) {
if (cmp(pivot, array[begin]) > 0) { // 左边元素 < 轴点元素
begin++;
} else { // 左边元素 >= 轴点元素
array[end--] = array[begin];
break;
}
}
}
// 将轴点元素放入最终的位置
array[begin] = pivot;
// 返回轴点元素的位置
return begin;
}
View Code