快速排序(二分思想,递归)

p话少说,自己看代码

#include 
#include 
#include "common.h"

using namespace std;

int a[101];
int n;

void QSort(int left, int right)
{
	int i;
	int j;
	int t;
	int key;
	if (left > right)	//当左边大于右边时 退出排序
	{
		return;
	}
	key = a[left];	//第一轮调用,此时key为6
	i = left;
	j = right;
	/*
	在这里演示一下第一轮while的排序情况,这里所说的第一轮指的是还未开始递归,也就是刚被主函数调用的时候
	最初:6 1 2 7 9 3 4 5 10 8
	然后:6 1 2 5 9 3 4 7 10 8
	最后:6 1 2 5 4 3 9 7 10 8
	*/
	while (i != j)
	{
		//一定要先从右到左找
		//先从右到左找到第一个小于key的值
		while (a[j] >= key && i < j)
		{
			--j;
		}
		//然后再从左到右找
		//从左到右找到第一个大于key的值
		while (a[i] <= key && i < j)
		{
			++i;
		}
		//在i和j !没有! 越界前
		//所谓的 !越界! 就是i大于了j 或者 j小于了i
		//就把a[i]和a[j]的值进行交换
		if (i < j)
		{
			SWAP(&a[i], &a[j]);
		}
	}
	//在此之前 数组中的排列情况如上所示
	a[left] = a[i];
	a[i] = key;
	//执行完上面这一句之后,数组中的排列情况如下
	//3 1 2 5 4 6 9 7 10 8
	//这时候,key=6的左边都小于key,key的右边都大于key,因此对左右在进行快排
	QSort(left, i - 1);
	QSort(i + 1, right);
	return;
}

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; ++i)
	{
		scanf("%d", &a[i]);
	}
	QSort(1, n);
	for (int i = 1; i <= n; ++i)
	{
		printf("%d ", a[i]);
	}
	return 0;
}

注释中的排列情况均为第一轮快排,也就是刚从主函数进入QSort(int, int)函数之后,进行一轮排序,在递归调用之前的排列情况。

在最坏情况下,时间复杂度为:O(n^2);
在平均情况下。时间复杂度为O(nlogn);
其中,n为排序规模。

你可能感兴趣的:(简单算法,ACM算法集训)