常见排序算法:随机化快速排序算法

基本思想:在快速排序的思想上,对基数的选择采用了一个随机化的选择。

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

 

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