夯实基础:排序算法之快速排序

概念

快速排序(Quicksort)是对冒泡排序的一种改进。

快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。--《百度百科》

 

模拟快速排序过程

任务:使用快速排序将数组从大到小排列。

原始数组:

第一趟循环:

首先将第一个元素17定位基准值。

然后根据与基准值的大小关系分组。

将红色箭头作为大于基准值的边界,将绿色箭头作为小于基准值的边界。

当红色箭头指向元素的下一个元素大于基准值,红色箭头后移一位。

当绿色箭头指向元素的上一个元素小于基准值,绿色箭头前移一位。

直到绿色箭头与红色箭头指向同一个位置,循环结束。

第一次分组循环结果:

分组效果不明显。

第二趟循环:

将第一次循环结果再次分组。因为没有大于基准值的组,所以只需要循环小于基准值的组。

将第一个元素11设置为基准值。

先从绿色箭头开始移动:

因为11 > 8,所以绿色箭头前移。

11 > 3,所以绿色箭头前移。

11 > 5,所以绿色箭头前移。

11 < 15,所以红色箭头与绿色箭头指向元素值交换。

然后移动红色箭头:

因为11 < 15,所以红色箭头后移。

因为11 > 4,所以红色箭头与绿色箭头指向元素值交换。

再移动绿色箭头:

因为11 > 4,所以绿色箭头前移。

因为11 > 6,所以绿色箭头前移。

因为11 > 10,所以绿色箭头前移。

因为11 < 12,所以红色箭头与绿色箭头指向元素值交换。

再移动红色箭头:

红色箭头与绿色箭头完成此趟循环。红色箭头前面的就是大于基准值的组,绿色箭头后面的就是小于基准值的组。

以此类推。

...

直到得出排序结果:

 

快速排序代码

public static int[] quickSort(int arr[],int start,int end) {
    int pivot = arr[start];
    int i = start;
    int j = end;
    while (i < j) {
        while ((i < j) && (arr[j] < pivot)) {
            j--;
        }
        while ((i < j) && (arr[i] > pivot)) {
            i++;
        }
        if ((arr[i] == arr[j]) && (i > j)) {
            i++;
        } else {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
    if (i - 1 > start)
        arr = quickSort(arr,start,i-1);
    if (j + 1 < end)
        arr = quickSort(arr,j+1,end);
    return (arr);
}

快速排序效率

时间复杂度:快速排序的时间复杂度跟归并排序是一样的,都是N个元素循环logN次,所以时间复杂度为O(N * logN)。

空间复杂度:O(1)。

稳定性:稳定。

你可能感兴趣的:(排序算法)