https://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95
它的基本思想是
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
仍以归并排序示例中的数列进行举例
初始状态{6,202,100,301,38,8,1}
第一轮排序,比较6次
设定两个指针,i = 1
从前向后找,j = 6
从后向前找
锚定6
,从后向前查找比6小的数字,找到1,j--,交换6和1(比较1次)
{1},{202,100,301,38,8},{6}
从前向后找,大于6的数字,找到202,i++,交换6和202(比较1次)
{1},{6},{100,301,38,8,202}
从后向前查找比6小的数字,未找到(比较4次)
第二轮排序,比较4次
此时,i = 3
从前向后找,j = 5
从后向前找
锚定100,从后向前查找比100小的数字,找到8,交换100和8(比较2次)
{1,6},{8,301,38},{100},{202}
从前向后查找,比100大的数字,找到301,交换100和301(比较1次)
{1,6},{8},{100,38},{301,202}
从后向前查找,比100小的数字,找到38,交换100和38(比较1次)
{1,6},{8,38},{100},{301,202}
第三轮排序,比较2次
比较8和38,8比38小,顺序无需变更(比较1次)
比较301和202,更换顺序(比较1次)
{1,6},{8,38},{100},{202,301}
完成排序
java代码:
public static int[] qsort(int[] arr, int start, int end){
if(start >= end){
return arr;
}
int i = start;
int j = end;
int point = arr[start];
while(i < j){
while((i < j) && arr[j] > point){
j --;
}
while((i < j) && arr[i] < point){
i ++;
}
if(i < j && arr[i] == arr[j]){
i ++;
} else if(i < j){
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
System.out.println(Arrays.toString(arr) + String.format(" - %d @ [%d, %d]", point, start, end));
}
System.out.println("--");
arr = qsort(arr, start, i - 1);
arr = qsort(arr, i + 1, end);
return arr;
}
public static void main(String[] args) {
int[] arr = {6, 202, 100, 301, 38, 8, 1};
System.out.println(Arrays.toString(arr) + " - start");
arr = qsort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr) + " - end");
}
输出:
[6, 202, 100, 301, 38, 8, 1] - start
[1, 202, 100, 301, 38, 8, 6] - 6 @ [0, 6]
[1, 6, 100, 301, 38, 8, 202] - 6 @ [0, 6]
[1, 6, 100, 301, 38, 8, 202] - 6 @ [0, 6]
--
[1, 6, 8, 301, 38, 100, 202] - 100 @ [2, 6]
[1, 6, 8, 100, 38, 301, 202] - 100 @ [2, 6]
[1, 6, 8, 38, 100, 301, 202] - 100 @ [2, 6]
[1, 6, 8, 38, 100, 301, 202] - 100 @ [2, 6]
--
[1, 6, 8, 38, 100, 301, 202] - 8 @ [2, 3]
--
[1, 6, 8, 38, 100, 202, 301] - 301 @ [5, 6]
[1, 6, 8, 38, 100, 202, 301] - 301 @ [5, 6]
--
[1, 6, 8, 38, 100, 202, 301] - end
全部评论