快速排序

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归或者非递归进行,以此达到整个数据变成有序序列。

快速排序过程图:

快速排序_C++


快速排序和归并排序有一些相同点和一些不同点,比如两种都使用了分治的思想,都是递归+排序,不同点在于归并排序是先递归后排序,而快速排序是先排序,后递归。


快速排序原理

1)设置两个变量i、j,排序开始的时候:i=0,j=N-1; [1]
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]; [1]
3)从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]的值交换; [1]
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换; [1]
5)重复第3、4步,直到 i 等于 j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外, i 等于 j 这一过程一定正好是i+或j-完成的时候,此时令循环结束)。


代码

void func(int * a, int s, int e)
{
	//快速排序使用的是分治法,我们可以使用递归来重复操作

	if (s == e)return;
	//排序
	int i = s;
	int j = e;
	int data = a[s];
	int arrint = s;
	while (j != i)
	{
		//从右往左遍历
		for (int f = j; f >=s; f--)
		{
			if (j == i)	break;
			if (data <= a[f])
			{		
				int temp = a[f];
				a[f] = a[arrint];
				a[arrint] = temp;
				arrint = f;
				j = f - 1;
				break;
			}
			j = f - 1;
		}
		//从左往右遍历
		for (int f = i; f <= e; f++)
		{
			if (j == i)	break;
			if (data >= a[f])
			{
				int temp = a[f];
				a[f] = a[arrint];
				a[arrint] = temp;
				arrint = f;
				i = f+1;
				break;
			}
			i = f + 1;
		}
	}
	int min = s + (e - s) / 2;
	func(a, s, min);
	func(a, min + 1, e);
}

int main()
{
	//归并的参数值 和快速参数值的不同作用
	int a[] = { 8,7,10,12,4,5,6,9 };
	func(a, 0, 7);

	for (int i = 0; i <8; i++)
	{
		cout << a[i] << " ";
	}
	return 0;
}