具体思想参考 https://blog.csdn.net/weixin_43734095/article/details/105156039
我的代码:
package _01_sort.cmp;
import _01_sort.Sort;
public class _09_QuickSort<T extends Comparable<T>> extends Sort<T> {
@Override
protected void sort() {
sort(array,0,array.length-1);
}
private void sort(T[] array,int low,int high){
if(low >= high) return;
int mid = partition(array,low,high);
sort(array,low,mid-1);
sort(array,mid+1,high);
}
private int partition(T[] array,int low,int high){
if(low == high) return low;
int right = high;
int left = low + 1;
T pivot = array[low];
while(right >= left){
if(cmp(array[right],pivot)>0){
right--;
}else{
if(cmp(array[left],pivot)<=0){
left ++;
}else{
T tmp = array[left];
array[left] = array[right];
array[right] = tmp;
left ++;
right--;
}
}
}
//right = left - 1
array[low] = array[right];
array[right] = pivot;
return right;
}
}
明哥的代码:
package _01_sort.cmp;
import _01_sort.Sort;
/**
* 快速排序
*/
public class _09_QuickSortMj<T extends Comparable<T>> extends Sort<T> {
@Override
protected void sort() {
sort(0, array.length);
}
/**
* 对 [begin, 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) {
// 随机选择轴点元素
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; // begin==end
}
}
【_09_QuickSort】
稳定性:false 耗时:0.005s(5ms) 比较:43.99万 交换:0
------------------------------------------------------------------
【_08_MergeSort2】
稳定性:false 耗时:0.006s(6ms) 比较:26.11万 交换:0
------------------------------------------------------------------
【_09_QuickSortMj】
稳定性:false 耗时:0.006s(6ms) 比较:32.23万 交换:1.26万
------------------------------------------------------------------
【_08_MergeSort】
稳定性:true 耗时:0.007s(7ms) 比较:26.11万 交换:0
------------------------------------------------------------------
【_03_HeapSort】
稳定性:false 耗时:0.012s(12ms) 比较:51.08万 交换:2.00万
------------------------------------------------------------------
【_05_Insert_BinarySearch】
稳定性:true 耗时:0.265s(265ms) 比较:26.08万 交换:0
------------------------------------------------------------------
【_02_Select】
稳定性:true 耗时:0.392s(392ms) 比较:2.00亿 交换:2.00万
------------------------------------------------------------------
【_04_Insert2】
稳定性:true 耗时:0.49s(490ms) 比较:1.16亿 交换:0
------------------------------------------------------------------
【_04_Insert】
稳定性:true 耗时:0.562s(562ms) 比较:9929.57万 交换:9927.57万
------------------------------------------------------------------
【_01_Bubble】
稳定性:true 耗时:1.292s(1292ms) 比较:2.00亿 交换:9927.57万
------------------------------------------------------------------
【_01_Bubble_3】
稳定性:true 耗时:1.813s(1813ms) 比较:2.00亿 交换:9927.57万
------------------------------------------------------------------
【_01_Bubble_2】
稳定性:true 耗时:1.839s(1839ms) 比较:2.00亿 交换:9927.57万
------------------------------------------------------------------
Process finished with exit code 0