排序算法之快速排序

算法思想

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

算法步骤

  1. 设置两个变量i、j,排序开始的时候:i=0,j=N-1;

  2. 以第一个数组元素作为关键数据,赋值给key,即key=A[0];

  3. 从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;

  4. 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

  5. 重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

一趟排序的过程
排序的全过程

算法复杂度

  • 快速排序的平均时间复杂度为:O(nlogn)
  • 快速排序最差的情况下时间复杂度为:O( n^2 )

算法实现(JAVA)

public void quickSort(int[] arr,int low,int high){
        if(low < high){
            int loc = partition(arr,low,high);
            quickSort(arr,low,loc - 1);
            quickSort(arr,loc + 1,high);
        }
    }

private int partition(int[] arr,int low,int high){
        int standard = arr[low];
        while(low < high){
            //从后向前
            while(low < high && arr[high] >= standard)--high;
            arr[low] = arr[high];
            //从前向后
            while(low < high && arr[low] <= standard)++low;
            arr[high] = arr[low];
        }
        arr[high] = standard;

        return low;
    }

参考文章

  1. 八大排序算法
  2. 快速排序-百度百科
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,220评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,743评论 0 15
  • 采用分治的思想,首先选取一个基准值pivot,然后将小于基准值的数放到左边,大于基准值的数放到右边。而对于左边的部...
    哇哇哇one阅读 456评论 0 1
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 1,282评论 0 2
  • 感恩昨天一天觉察到自己的低效,最要做的事情排在后面,结果到睡了还没时间做。以后事情想起来要及时做,对峙拖延。 感恩...
    寸心洁白阅读 104评论 0 2