您的位置:首页 > 其它

快速排序 与 直接选择排序

2013-12-31 16:28 375 查看
/**************************************************************************
* 题目:编写程序实现快速排序与直接选择排序相结合的排序算法。要求对输入
*    的序列,用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: