快速排序

代码
public   static   void  QuickSort( int [] data, int  low, int  high)
    {
        
int  i = low;
        
int  j = high;
        
int  tmp = data[low];
        
        
while (low < hight)
        {
            
while ((low < high)  &&  (data[high] >= tmp))
            {
                
-- high;
            }
            data[low]
= data[high];
            
++ low;
            
while ((low < high)  && (data[low] <= tmp))
            {
                
++ low;
            }
            data[high]
== data[low];
            
-- high;
        }
        data[low]
= tmp;
        
if (i < low - 1 )
        {
            QuickSort(data,i,low
- 1 ); 
        }
        
if (j > low + 1 )
        {
            QuickSort(data,low
+ 1 ,j);
        }
    }

快速排序算法的时间复杂度和每次划分的记录关系很大。如果每次选取的记录都能均分成两个相等的子序列,这样的快速排序过程是一棵完全二叉树结构(即每个结点都把当前待排序列分成两个大小相当的子序列结点,n个记录待排序列的根结点的分解次数就构成了一棵完全二叉树),这时分解次数等于完全二叉树的深度log2n。每次快速排序过程无论把待排序列这样划分,全部的比较次数都接近于n-1次,所以,最好情况下快速排序的时间复杂度为O(nlog2n)。快速排序算法的最坏情况是记录已全部有序,此时n个记录待排序列的根结点的分解次数就构成了一棵单右支二叉树。所以在最坏情况下快速排序算法的时间复杂度为O(n2)。一般情况下,记录的分布是随机的,序列的分解次数构成一棵二叉树,这样二叉树的深度接近于log2n,所以快速排序算法在一般情况下的时间复杂度为O(nlog2n)。
另外,快速排序算法是一种不稳定的排序的方法。

你可能感兴趣的:(快速排序)