• 快速排序(QuickSort)


    算法描述

    快速排序(Quick Sort)属于冒泡排序的一种变形。快速排序是一种不稳定性的排序。


    基本思想

    通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分的关键字小,则可分别对这部分记录继续进行排序,直至整个序列有序为止。


    实现步骤

    1. 最左边的元素作为参照数据;
    2. 小于参照数据的集合作为左边的子集合,大于参照数据的集合作为右边的子集合
    3. 分别对左右子集合进行快速排序;
    4. 直到所有的序列是有序为止。

    算法实现

    代码在xcode中验证,可以直接使用
     
    //通过一趟排序,将记录分为两部分,左边部分小于a[begin], 右边部分大于a[begin]
    int Q_Sort(int a[], int begin, int end)
    {
        int index = a[begin];
        int i = begin;
        int j = end;
        while(i < j)
        {
            while(i < j && a[j] >= index)
                j--;
            if(i < j)       //前后指针是否相同
            {
                a[i++] = a[j];
            }
            
            while(i < j && a[i] <= index)
                i++;
            if(i < j)       //前后指针是否相同
            {
                a[j--] = a[i];
            }
        }
        a[i] = index;
        return i;
    }
    
    //通过Q_Sort得到中间的index,然后分别排序左边部分和右边部分,直到begin=end
    void QuickSort(int a[],int begin,int end)
    {
        if(begin < end)
        {
            int index = Q_Sort(a, begin, end);
            QuickSort(a, begin, index-1);
            QuickSort(a, index+1, end);
        }
    }

    性能分析

    平均时间复杂度为o(n*lgn),空间复杂度为o(1)
    如果是有序序列,则快速排序会蜕变成冒泡排序,其时间复杂度为o(n^2)
    如果是随机序列,则时间复杂度为o(n*lgn)

     
  • 相关阅读:
    失业状态,整理一下近期的面试问题 -- 直面自我
    nginx 学习 查一天不如问一句
    (10)kendo UI使用基础介绍与问题整理——MultiSelect
    kendo常用的实用方法(肯定有用得上的)
    (9)kendo UI使用基础介绍与问题整理——numerictextbox/基础说明
    去掉小数点后无效的0
    cmakelists编写样例
    visio 设计
    优化压测
    (转)语音处理基础知识
  • 原文地址:https://www.cnblogs.com/mmix2009/p/3503501.html
Copyright © 2020-2023  润新知