zoukankan      html  css  js  c++  java
  • 快速排序

    概念介绍

      有同学想了解快速排序,今天它来了!快速排序的基本思想是:通过一轮排序,将要排序的数据分为独立的两个部分,其中一部分的数据比另外一部分数据都要小。分成两部分后,再按上述方法对这两部分数据进行排序,整个排序过程是递归进行的。举个简单的例子,一个操场上有一群人,根据身高将人群分成两部分,身高在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,如果发现不足之处,请联系我进行更改,十分感谢!关注我,带你了解更多排序算法!

  • 相关阅读:
    性能优化之_android多线程
    bootstrap搜索样式
    bootstrap模态框通过传值解决重复提交问题
    web请求乱码问题总结
    jsp页面自动换行
    cron表达式
    js中简单操作
    文件上传(前端)
    viz.js操作流程
    graphviz.js划线操作
  • 原文地址:https://www.cnblogs.com/maguanyue/p/13230814.html
Copyright © 2011-2022 走看看