快速排序

概念介绍

  有同学想了解快速排序,今天它来了!快速排序的基本思想是:通过一轮排序,将要排序的数据分为独立的两个部分,其中一部分的数据比另外一部分数据都要小。分成两部分后,再按上述方法对这两部分数据进行排序,整个排序过程是递归进行的。举个简单的例子,一个操场上有一群人,根据身高将人群分成两部分,身高在170CM以下的人群走到操场的左边,170CM以上的人群走到右边,这时候根据170CM这个身高值将人群划分了。接下来再对左右两部分进行重复的操作,左边的人群可以继续以160cm的身高进行划分,右边的人群可以根据180CM的身高进行划分,直至所有人的身高排序完成。

  以[537641029108]为例进行排序。设定pivot=5(以数组第一个数字为关键数字进行排序),左指针l=0,右指针r=9。从数组左边开始找,第一个大于等于pivot的数是arr[0]=5,从数组右边开始找,第一个小于等于5(pivot)的数是arr[7]=2,将这两个数进行交换,交换后序列为[237641059108],此时l=0,r=7。

  交换继续,从2开始往右找,左指针开始移动,第一个比5大的数是arr[2]=7,此时将7和5进行交换,交换后序列为[235641079108],此时l=2,r=7。

  交换继续,从7开始往左找,右指针开始移动,第一个比5小的数是arr[6]=0,此时将0和5进行交换,交换后序列为[230641579108],此时l=2,r=6。

  交换继续,从0开始往右找,左指针开始移动,第一个比5大的数是arr[3]=6,此时将6和5进行交换,交换后序列为[230541679108],  此时l=3,r=6。

  交换继续,从6开始往左找,右指针开始移动,第一个比5小的数是arr[5]=1,此时将1和5进行交换,交换后序列为 [230145679108],此时l=3,r=5。

  交换继续,从1开始往右找,左指针开始移动,直到l=5的时候,才有大于等于5的数,此时l=r=5,序列为[230145679108],以5为界,将序列分为左右两部分,左边的都比5小,右边的都比5大,此时第一趟排序完成。接下来,我们可以对序列左右两部分继续进行递归,直至排序完成。

代码实现

    public static void quickSort(int[] arr, int left, int right) {
        int pivot = arr[left];    // 选取数组的第一个值作为关键数据
        int l = left;   //左下标
        int r = right;  //右下标

        while (l < r) {
            // 从左边开始找,直至找到大于等于pivot的值
            while (l < r && arr[l] < pivot) {
                l++;
            }
            // 从右边开始找,直至找到小于等于pivot的值
            while (l < r && arr[r] > pivot) {
                r--;
            }
            // 存在相等,直接移动指针
            if(l<r && arr[l]==arr[r]){
                l++;
            }else {
                //否则进行数据交换
                int temp = arr[l];
                arr[l] = arr[r];
                arr[r] = temp;
            }
        }
        // 将左侧数据递归处理
        if(l-1>left) quickSort(arr,left,l-1);
        // 将右侧数据递归处理
        if(r+1<right) quickSort(arr,r+1,right);
    }

  至此,代码编写完成,Git地址:https://github.com/HollowCup/algorithms-and-data-structure,具体实现位于algorithm工程下的sort目录QuickSort,如果发现不足之处,请联系我进行更改,十分感谢!关注我,带你了解更多排序算法!

原文地址:https://www.cnblogs.com/maguanyue/p/13230814.html