常見排序算法:隨機化快速排序算法

基本思想:在快速排序的思想上,對基數的選擇採用了一個隨機化的選擇。

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;
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章