基本思想:在快速排序的思想上,對基數的選擇採用了一個隨機化的選擇。
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;
}
}