← 返回首页
常见排序算法之-快速排序
发表时间:2019-11-23 20:56:19
讲解常见排序算法之-快速排序

快速排序算法的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

1.算法步骤 该方法的基本思想是:

1.先从数列中取出一个数作为基准数(一般是数组的第一个元素)。 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。 3.再对左右区间重复第二步,直到各区间只有一个数。

以一个数组作为示例,取区间第一个数为基准数。

初始时,i = 0; j = 9; X = a[i] = 72

由于已经将 a[0] 中的数保存到 X 中,可以理解成在数组 a[0] 上挖了个坑,可以将其它数据填充到这来。

从j开始向前找一个比X小或等于X的数。当j=8,符合条件,将a[8]挖出再填到上一个坑a[0]中。a[0]=a[8]; i++; 这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。这次从i开始向后找一个大于X的数,当i=3,符合条件,将a[3]挖出再填到上一个坑中a[8]=a[3]; j--;

数组变为:

i = 3; j = 7; X=72 再重复上面的步骤,先从后向前找,再从前向后找。

从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++;

从i开始向后找,当i=5时,由于i==j退出。

此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将X填入a[5]。

数组变为:

可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。

2.代码实现

public static void quickSort(int[] arr, int leftIndex, int rightIndex){
    int i, j;  //寻迹节点
    int pivot; //基准数
    int temp; //用于交换的中间变量 
    if(leftIndex >= rightIndex)
        return;
    pivot = arr[leftIndex];
    i = leftIndex;
    j = rightIndex;
    while (i != j){
        while (arr[j] >= pivot && i < j)
        j--;
        while (arr[i] <= pivot && i < j)
        i++;

        if(i < j){
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
        }
    }
    //将基准数归位
    arr[leftIndex] = arr[i];
    arr[i] = pivot;
    //一分为二,进行递归
    quickSort(arr, leftIndex, i - 1);
    quickSort(arr, i + 1, rightIndex);

}

public static void main(String[] args) {
    int[] arr = {12,8,8,34,56,10,2,77,33};

    quickSort(arr,0,arr.length-1);

    for(int n:arr){
        System.out.print(n+"  ");
    }
}

3.小结 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。