快速排序 与 直接选择排序

/**************************************************************************
  * 题目:编写程序实现快速排序与直接选择排序相结合的排序算法。要求对输入
 *    的序列,用PARTITION过程分割成小于10个记录为一组的子序列,然后
 *    对每个子序列实施直接选择排序。
 * 函数:
 *    Swap: 交换两个参数的值
 *    Rand: 产生 begin至end之间的随机整数
 *    StraightSelectSort: 直接选择排序 
  *    PARTITION: 分区
 *    QUICKSORT: 实现排序
 *
  ***************************************************************************/

 #include <iostream>
 #include <iomanip>
 #include <time.h>
using namespace std;

 template < typename Type >
void inline Swap (Type& a, Type& b)
 {
     Type temp = a;
     a = b;
     b = temp;
 }

 template < typename Type >
 Type inline Rand (Type begin, Type end)
 {
     Type value = rand()%(begin - end + 1) + begin;             //value ~ [begin,end]
    return value;
 }

 template < typename Type >
void StraightSelectSort (Type list[], int begin, int end)
 {
     int min;
     for(int i=begin; i <= end; ++i)
     {
     min = i;
     for(int j=i; j <= end; ++j)
         if(list[j] < list[min])
         min = j;
     Swap<Type>(list[i],list[min]);
     }
 }

 template < typename Type >
int PARTITION (Type list[], int begin, int end)
 {
     int temp = Rand (begin ,end);
     Swap(list[temp],list[end]);

     int i = begin - 1;
     int x = list[end];
     for(int j = begin; j < end; ++j) // j: from begin to end-1
    {
     if(list[j] <= x)
     {
         ++i;
         Swap(list[i], list[j]);
     }
     }
     Swap(list[i+1], list[end]);
     return ++i;
 }

 template < typename Type >
void QUICKSORT ( Type list[], int begin, int end)
 {
     if(begin >= end)
     return;
     else if ( end - begin < 10 )
     StraightSelectSort (list, begin, end);
     else
     {
     int q = PARTITION (list, begin, end);
     QUICKSORT (list, begin, q-1);
     QUICKSORT (list, q, end);
     }
 }


//测试

int main()
 {
     srand(time(0));
     int x[100];
     for(int i=0;i<100;++i)
     x[i] = Rand(0, 1000); 

     cout << "随机生成的原始数据 :";
     for(int i=0;i<100;++i)
     {
     if(0 == i%10)
         cout<<endl;
     cout << setw(5) << x[i];
     }

     QUICKSORT (x, 0, 99);

     cout << endl << endl << "排序后的数据:";
     for(int i=0;i<100;++i)
     {
     if (0 == i%10)
         cout<<endl;
     cout << setw(5) << x[i]; 
     }
     return 0;
 }

 

posted @ 2013-12-31 16:28  博园少主  阅读(380)  评论(0编辑  收藏  举报