算法--快速排序

来源:互联网 发布:java log4j 日志格式 编辑:程序博客网 时间:2024/06/06 22:24
排序 


快速排序




       快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。


分治法的基本思想
     分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。


int pivotPartition(int a[], int low, int high){    // 在a[low ~ high]范围内     // 以a[low]为轴,找到a[low]的最终位置,使得在该位置以前都比a[low小],    // 之后都比a[low]大。    // 并且返回a[low]的位置。    if(low >= high) return low;    int pivot = a[low];    while(low < high)    {        while(low < high && pivot <= a[high])   --high;        a[low] = a[high];        while(low < high && pivot >= a[low])    ++low;        a[high] = a[low];    }    a[low] = pivot;    return low;}




void QuickSort(int a[], int n){    // 非递归算法形式,使用栈。    if(!positiveCheck_0out(n))  return ;    int *filoStack = new int[n];    int top = -1;    /// low 先进,high后进。    filoStack[++top] = 0;    filoStack[++top] = n - 1;    int low, high;    int pivot;    while(top >= 0)    {        high = filoStack[top--];        low = filoStack[top--];        pivot = pivotPartition(a, low, high);        if(pivot - 1 > low)        {            filoStack[++top] = low;            filoStack[++top] = pivot - 1;        }        if(pivot + 1 < high)        {            filoStack[++top] = pivot + 1;            filoStack[++top] = high;        }    }    delete[] filoStack;}









时间 平均O(nlog n),  最坏O(n^2),原始序列有序或,基本有序的情况下,算法性能最坏。
空间 平均O(log n),   最坏O(n^2),同上,最坏情况下,每次将n个元素的带排序列分成1个和n-1个。需要递归n次,即栈空间也是2n = (low + high) * n = (1 + 1) *n




不是很精通算法的分析,只能照本宣科的说说自己知道的。不过大抵能体会到核心思想。
具体的深入分析,我就不ctrl + c ctrl + v了,附上大神们的深度分析。
http://blog.csdn.net/v_JULY_v/article/details/6211155






归并排序和快速排序都应用分治的思想。二者的区别是,快速排序在“分”的上面比较复杂,对应的是partition()这个函数;在“治”上很简单,就是没有。而归并排序在“分”上很简单,就是二分法;在“治”上较复杂。

0 0
原创粉丝点击