快速排序的主要思想就是:将待排序数组以某一个元素为阈值分为两个子列,一个子列包含所有比改阈值小的元素,另一个子列反之。这样只要将这两个子列排好序,整个数组也就排好序了。这里有一个关键的子过程就是划分的过程Partition,一般可以选择数组中任意的元素作为划分阈值,这里选择的是数组中最右端的元素。

       Partition使用了二分查找类似的思想:使用两个索引器从数组的两端进行遍历,左边的索引器遇到比阈值大的元素停止,右边的索引器遇到比自己小的元素停止,然后交换这两个元素,依次循环。这样数组就划分为了比该阈值大和小(含等于)两个子列了。

两者的实现源码为:

template <class Item>

       int Partition(Item* data,int len)

       {

              Item tmp = data[len - 1];

             

              int i = 0;

              int j = len - 1;

             

              for (;;)

              {

                     while (tmp > data[i])

                            i++;

                           

                            while (tmp < data[--j])

                            {

                                   if (j == 1)

                                          break;

                            }

                           

                            if (i >= j)

                                   break;

                           

                            Exch2Item(data[i],data[j]);

                     }

            Exch2Item(data[i],data[len -1]);

       return i;

       }

template <class Item>

       void QuickSort(Item* data,int len)

       {

              if (len <= 1)

                     return ;

             

              int i = Partition(data,len);

             

              QuickSort(data,i);

              QuickSort(data + i,len - i);

       }

测试程序为:

int main(int argc,char* argv[])

{

       using namespace sortAlg;

 

       int* data = InitData<int>(10,100);

 

       PrintData<int>(data,10,"before BubbleSort");

 

       QuickSort(data,10);             

 

       PrintData<int>(data,10,"after BubbleSort");

       return 0;

}

需要说明和注意的是:InitData PrintData定义和实现在排序与查找——备用函数给出的,请参考上一篇文章。

Posted on 2005-07-17 11:09  k_eckel's mindview  阅读(559)  评论(2)    收藏  举报