快速排序几种做法

1. 枢纽元选取数组第一个元素,不过针对降序数组会有最坏时间复杂度O(N^2)

#include <iostream>

void qSort(int* a, int l, int r)
{
	if(l < r)
	{
		int i = l;
		int j = r;
		int pivot = a[i];
		while(i < j)
		{
			while(a[j] > pivot && i < j)
				j--;
			if(i < j)
				a[i++] = a[j];
			while(a[i] < pivot && i < j)
				i++;
			if(i < j)
				a[j--] = a[i];


		}
		a[i] = pivot;
		qSort(a, l, i - 1);
		qSort(a, i + 1, r);
	}
}

int main()
{
	int a[] = {34, 32, 4, 2, 1, 0};
	qSort(a, 0, 5);

	return 0;
}



2. 选取随即数为枢纽元,这样一般可以避免碰到最坏时间消耗

#include <iostream>

void swap(int& a, int& b)
{
	int temp = a;
	a = b;
	b = temp;
};


int partition(int* a, int l, int r, int pi)
{
	//swap pivot and the rigthmost element
	swap(a[pi], a[r]);

	int pivot = a[r];
	int front = l;

	//put all the elements less than pivot to the front part
	for(int i = l; i < r; i++)
	{
		if(pivot > a[i])
		{
			swap(a[front], a[i]);
			front++;
		}
	}

	//put the pivot element into current front index position
	swap(a[front], a[r]);

	return front;
};

void qSort(int* a, int l, int r)
{
	if(l < r)
	{
		int ran = l + rand() % (r - l + 1);
		int p = partition(a, l, r, ran);

		if(p - 1 > l)
			qSort(a, l, p - 1);

		if(r > p + 1)
			qSort(a, p + 1, r);
	}
}
int main()
{
	int a[] = {52, 566, 1, 5, 0, 23, 12};
	qSort(a, 0, 6);

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值