Randomized quicksort

#include <vector>
#include <iostream>
#include <algorithm>
#include <Windows.h>

using namespace std;
// QuickSort(List A)
// if A size <= 1
//		return
// pick A[i] from A as pivot
// (L, M, R) <- partition-3way(A, i)
// QuickSort(List L)
// QuickSort(List R)

int partitionAtLast(vector<int> &arry, int start, int end)
{
	// choose the last element as pivot
	int i = start;
	for (int j = start; j <= end - 2; ++j)
		if (arry[j] <= arry[end - 1])
			swap(arry[i++], arry[j]);
	swap(arry[i], arry[end - 1]);
	return i;
}

void SimpleHelper(vector<int> &arry, int start, int end)
{
	if (start < end)
	{
		int pivot = partitionAtLast(arry, start, end);
		SimpleHelper(arry, start, pivot);
		SimpleHelper(arry, pivot + 1, end);
	}
}

// average case: O(nlog(n))
// the simple quick sort will degrade to O(n*n) if the array is sorted already
void quickSort_Simple(vector<int> &arry)
{
	SimpleHelper(arry, 0, arry.size());
}


void RandomizedHelper(vector<int> &arry, int start, int end)
{
	int i = start;
	int j = end - 1;
	int sz = end - start;
	int pivot;
	if (sz > 1)
	{
		pivot = rand() % sz + start;
		while (true)
		{
			while (arry[j] > arry[pivot] && j >= pivot)
				--j;
			while (arry[i] < arry[pivot] && i <= pivot)
				++i;
			if (i >= j)
				break;
			swap(arry[i], arry[j]);
		}
	}
	else
		return;

	RandomizedHelper(arry, start, pivot);
	RandomizedHelper(arry, pivot + 1, end);
}

void quickSort_Randomized(vector<int> &arry)
{
	RandomizedHelper(arry, 0, arry.size());
}

void printArray(const vector<int> &arry)
{
	for (int i = 0; i < arry.size(); cout << arry[i++] << " ");
	cout << endl;
}

int main()
{
	vector<int> arry{ 1, 8, 3, 5, 11, 9, 39, 21 };
	printArray(arry);
	quickSort_Randomized(arry);
	printArray(arry);
	system("PAUSE");
	return 0;
}

Reference:

http://www.cs.cmu.edu/~avrim/451f11/lectures/lect0906.pdf

http://www.cs.princeton.edu/~wayne/kleinberg-tardos/pdf/05DivideAndConquerI.pdf

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值