代码改变世界

快速排序(QuickSort)

2014-01-03 12:46  江湖么名  阅读(201)  评论(0编辑  收藏  举报

算法描述

快速排序(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)