基本思想:在快速排序的思想上,对基数的选择采用了一个随机化的选择。
1.对于递归到某一层的数组中,在该数组中随机化选择一个数字,把数组中的数字分为两部分,比该数字小的数据都放在它的左边,比该数字大的数据都放在它的右边。
2.适用递归的思路对每次选出来的数字的左右两边进行排序。
代码:
#include <iostream>
#include<time.h>
using namespace std;
int RandomInRange(int start, int end)
{
srand((unsigned)time(NULL));
return rand() % (end - start + 1) + start;//产生随机数
}
int Partition(int data[], int start, int end)
{
int index = RandomInRange(start, end);//随机选择一个位置
swap(data[index], data[end]);//将选取的数字放到最后
int small = start - 1;//small是一个移动指针,在它位置前的数据都是比它小的
for (index = start; index < end; index++)
{
if (data[index] < data[end])//从start开始跟选择出来的数字进行比较
{
++small;
if (small!=index)//不等的情况表示上一次small没有移动即上一次的data[small]>data[end]
swap(data[index], data[small]);//交换两个位置的数据
}
}
++small;
swap(data[small], data[end]);//将选出来的数字放在合适的位置
return small;
}
void Random_QuickSort(int data[], int start, int end)
{
if (start == end) return; //递归中止条件是待排序数组长度为1
int index = Partition(data, start, end); //选出来的数,左边都比它小,右边都比它大
if (index > start) Random_QuickSort(data, start, index - 1);//左半部分继续排序
if (index < end) Random_QuickSort(data, index + 1, end);//右半部分继续排序
}
int main()
{
int list[] = { 12, 5, 4, 6, 7, 6, 1 };
Random_QuickSort(list,0, sizeof(list) / sizeof(int)-1);
for (int i = 0; i < sizeof(list) / sizeof(int); i++)
{
cout << list[i] << endl;
}
}