快速排序再理解(java实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013963380/article/details/76196485

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

该排序方法的基本思想:
(1)先从数列中取一个元素作为基准点
(2)分区,将所有比基准点值大的元素放在基准点右边,将所有比基准点值小的元素放在基准点的左边
(3)分别对左右两部分重复步骤2,直到所有的分区只有一个元素

具体的实现步骤如下:
(1)首先在数组中选一个元素作为基准点(一般选第一个元素)。
(2)从数组的两端开始扫描数组,设置两个指针标示lo和hi(lo指向起始位置,hi指向末尾位置)。
(3)首先从后半部分开始扫描,发现比该基准点值小的元素,交换lo和hi位置的值。
(4)然后从前半部分开始扫描,发现比该基准点值大的元素,交换lo和hi位置的值。
(5)直到lo大于等于hi的时候,然后把基准点的值放在hi的位置,一次排序完成。(这样后基准点前半部分都比基准点的值小,后半部分都比基准点的值大)
(6)采用递归的方式分别对基准点前后两部分的数组进行排序。

代码实现如下:

public void quickSort(int[] a,int lo,int hi){
    if(lo >= hi) return;
    int i=lo;
    int j=hi;
    int base=a[i];

    while(i < j){//这里是一次排序的过程
        while(i < j && a[j]>=base){
            j--;//寻找比base大的值
        }
        a[i]=a[j];//找到后交换
        while(i < j && a[i]<base){
            i++;//寻找比base小的值
        }
        a[j]=a[i];//找到后交换
    }
    a[i]=base;
    //分别对base基准点的前后半部分排序
    quickSort(a,lo,i-1);
    quickSort(a,i+1,hi);
}

配合图讲解第一次排序:
这里写图片描述
以数列:4 1 8 3 2 6 7
首先选第一个元素为base基准点也就是base=4 (a[i]);
j从最后一个元素寻找,档j=4找到2比基准点小,将a[4] (a[i]=a[j])赋值给a[i]如图第一个方框。
然后i从开始元素寻找,当i=2找到8比基准点大,将a[2] (a[j]=a[i]赋值给a[j]如图第二个方框)。
然后接着j从j=4开始寻找,j=3找到3比基准点小,将a[3]赋值给a[i],如图第三个。
接着i从i=2开始寻找,i=3找到3此时i=j,将base赋值给i。
一次排序完成,形成
2 1 3 |4| 8 6 7
然后递归调用方法接着排序2 1 3和8 6 7
直到完成。

猜你喜欢

转载自blog.csdn.net/u013963380/article/details/76196485
今日推荐