【2.5】快速排序

       快速排序是对冒泡排序的一种改进。它的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
       假设待排序的序列为{a[L],a[L+1],a[L+2],……,a[R]},首先任意选取一个记录(通常可选中间一个记作为枢轴或支点),然后重新排列其余记录,将所有关键字小于它的记录都放在左子序列中,所有关键字大于它的记录都放在右子序列中。由此可以将该“支点”记录所在的位置mid作分界线,将序列分割成两个子序列和。这个过程称作一趟快速排序(或一次划分)。
       一趟快速排序的具体做法是:附设两个指针i和j,它们的初值分别为L和R,设枢轴记录取mid,则首先从j所指位置起向前搜索找到第一个关键字小于的mid的记录,然后从i所指位置起向后搜索,找到第一个关键字大于mid的记录,将它们互相交换,重复这两步直至i>j为止。
       快速排序的时间的复杂性是O(nlog2n),速度快,但它是不稳定的排序方法。就平均时间而言,快速排序是目前被认为是最好的一种内部排序方法
       由以上讨论可知,从时间上看,快速排序的平均性能优于前面讨论过的各种排序方法,但快速排序需一个栈空间来实现递归。若每一趟排序都将记录序列均匀地分割成长度相接近的两个子序列,则栈的最大深度为log(n+1)。
【样例输入】
       10
       2 3 1 2 4 55 3 55 3 2
【样例输出】
       1 2 2 2 3 3 3 4 55 55

【参考程序】

#include <cstdio>
#include <iostream>
using namespace std;

int a[101];

void qsort(int l, int r) {
	int i, j, mid, tmp;
	i = l;
	j = r;
	mid = a[(l+r)/2];				// 定义枢轴(选择当前序列在中间位置的数) 
	
	do {						
		while (a[i] < mid) {		// 在左半部分寻找比枢轴大的数 
			i++;
		}
		while (a[j] > mid) {		// 在右半部分寻找比枢轴小的数 
			j--; 
		}
		if (i <= j) {				// 若找到一组与排序目标不一致的数对,则交换它们 
			tmp = a[i];
			a[i] = a[j];
			a[j] = tmp;
			i++;					// 继续找 
			j--;
		}
	} while (i<=j);					// 注意这里不能少了等号 (一次快速排序) 
	
	if (l < j) {					// 若未找到两个数的边界,则递归搜索左右区间 
		qsort(l, j);
	}
	if (i < r) {
		qsort(i, r);
	} 
}

int main() {
	int n;
	cin >> n;
	for (int i=1; i<=n; i++) {		// 输入 
		cin >> a[i];
	}
	
	qsort(1, n);					// 快速排序
	
	for (int i=1; i<=n; i++) {		// 输出排序后的结果 
		cout << a[i] << " ";
	} 
	
	return 0;
}

发布了49 篇原创文章 · 获赞 0 · 访问量 1035

猜你喜欢

转载自blog.csdn.net/developer_zhb/article/details/105030200
2.5