Sorting Algorithm-Quick Sort

Quick Sort-快速排序

Algorithm:

快速排序(Quick Sort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

Ex:

以第一个元素5为key,第一轮循环,要把小于5的元素放左边,大于等于5的放右边

Sorting Algorithm-Quick Sort_第1张图片Sorting Algorithm-Quick Sort_第2张图片Sorting Algorithm-Quick Sort_第3张图片

接着递归,5左边的2,1,4,3重复,5右边的7,8,6,9重复。

Code1:

void Quick_Sort(vector<int> &v, int first, int end)
{
	if (first < end)
	{
		int key = v[first];
		int i = first;
		int j = end;
		while (i < j)
		{
			while (i < j&&v[j]>=key)
				j--;
			if (i < j)
				v[i] = v[j];
			while (i < j&&v[i] < key)
				i++;
			if (i < j)
				v[j] = v[i];
		}
		v[i] = key;  //此时i=j
		Quick_Sort(v, first, i-1);
		Quick_Sort(v, i+1, end);
	}
}

Code2:

int Partition(int data[], int length, int start, int end)  //分割
{
	int pivot = data[end];
	int curpos = start;
	for (int index = start; index < end; index++)
	{
		if (data[index] < pivot)
		{
			swap(data[index], data[curpos]);
			curpos++;
		}
	}
	swap(data[curpos], data[end]);
	return curpos;
}
void Quick_Sort(int data[],int length, int start, int end)
{
	if (start >= end)
		return;
	int index = Partition(data, length, start, end);
	if (start < index)
		Quick_Sort(data, length, start, index - 1);
	if (index < end)
		Quick_Sort(data, length, index + 1,end);
}


Analysis:

1、最好的情况下,每次的划分都会恰好从中间将序列划分开来,那么只需要logn次划分即可划分完成,是一个标准的分治算法。
EX:  H A C B F E G D L I K J N M O
每一次划分都需要比较N次
复杂度为O(nlogn)
2、最坏的情况下,即序列已经排好序的情况下,每次划分都恰好把数组分成了0,n两部分,那么需要n次划分,但是比较的次数约为n,n-1,n-2,...1,所以整个比较次数约为n(n-1)/2~(n^2)/2。
3、平均情况下:1.39NlogN
比归并排序多了30%的比较,但是由于涉及了较少的数据交换和移动操作,比归并快
4、为了避免出现最坏的情况,可以首先对序列进行随机化
5、快速排序是in-place算法
6、快速排序是不稳定排序


Improvement:

1、当划分到较小的子序列时,通常可以使用插入排序替代快速排序
2、三平均区分法(Median of three partition)
选择待排数组最左边,最右边,最中间的三个元素的中间值作为中轴(pivot)
(1)使最坏情况发生的几率减少了
(2)其次防止边界情况
3、三分区(3-way partition)快速排序


你可能感兴趣的:(快速排序)