1、浅析快速排序

适合数据量大的数据集进行排序,采用二分递归法把数组按升序或降序进行排序。
一、升序算法步骤【正序】:
1、选定一个基准数arr[start]
2、选定两个标兵left、right
3、right标兵从右向左移动,遇到比基准数小的数则停下来
4、left标兵从左向右移动,遇到比基准数大的数则停下来
5、交换right和left数
6、若left和right重合,则把重合数与基准数进行交换
7、一轮结束,基准数在中间
8、对基准数左右两边的数组重复上述步骤,直至left和right重合。
备注:降序只需要调整步骤3、4。

二、java代码:

public class FastSort {

    public static void main(String[] args) {
        int[] arr = {6, 2, 4, 6, 7, 8, 9, 2, 3, 4, 1};
        fastSort(arr, 0, arr.length - 1);
        for (int a : arr) {
            System.out.print(","+a);
        }
    }

    public static void fastSort(int[] arr, int start,int end){

        // 开始索引大于等于结束索引则停止排序
        if (start >= end) {
            return;
        }

        // 1、选定一个基准数arr[start]
        int flag = arr[start];
        // 2、选定两个标兵left、right
        int left = start;
        int right = end;

        // 当两位标兵未重合则继续探索
        while (left < right) {
            // 3、right标兵从右向左移动,遇到比基准数小的数则停下来
            while (left < right && arr[right] >= flag) {
                right--;
            }

            // 4、left标兵从左向右移动,遇到大于基准数的数则停下来
            while (left < right && arr[left] <= flag) {
                left++;
            }

            //5、交换right和left数
            if (left < right) {
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
            }
        }

        // 6、若left和right重合,则把重合数与基准数进行交换
        arr[start] = arr[left];
        arr[left] = flag;

        // 8、对基准数左右两边的数组重复上述步骤,直至left和right重合。
        fastSort(arr, start, left - 1);
        fastSort(arr, left + 1, end);
    }
}

三、时间复杂度
1、最好情况:每次划分都很均匀。
趟数 复杂度
1  n
2  n + 2(1/2n)=2n
3  n + 2(1/2n) + 4(1/4n) = 3n
k  kn
又因为:
n = 2^k( n是数列长度,k是能划分的最大趟数)
所以:
k = logn
F = O(nlogn)

2、当待排序的序列为正序或逆序排列时,且每次划分只得到一个比上一次划分少一个记录的子序列,注意另一个为空。
趟数 复杂度
1  n
2  n+(n - 1)
3  n+(n-1)+(n-2)
n  n+(n-1)+(n-2)...+1 = n(n-1)/2=n^2
所以F=0(n^2)

下一篇:2、浅析冒泡排序

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

推荐阅读更多精彩内容

  • iOS中常用的排序方法有(冒泡、选择、快速、插入、希尔、归并、基数) 接下来就依次介绍一下,直接上代码 1、冒泡排...
    Leeson1989阅读 1,052评论 0 0
  • 一、直接插入排序 直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的元素记录,按其关键字...
    kevin16929阅读 579评论 0 0
  • 排序算法 冒泡排序 选择排序 插入排序 快速排序(最常见) 希尔排序 归并排序 源码:Sorting 冒泡排序 冒...
    廖少少阅读 2,745评论 12 101
  • 目录 一.交换排序[https://www.cnblogs.com/maluning/p/7944809.html...
    小緈福阅读 5,582评论 0 1
  • 一、什么是小密圈 小密圈是一个用于社群运营的工具,自建圈子聚集粉丝的工具 本质就是一个微论坛,谁开通谁就是这个论坛...
    赤叶清风阅读 326评论 0 0