快排的动态演示
描述:
快排的关键在于分区, 而分区的关键在于选定主元,主元是数组其他元素分区的标准。 可以把比主元小的元素分为一部分, 把比主元大或等于的元素分为一部分,最后将主元放于两部分中间。 主元的选择是任意的。但不同的选择策略对算法的实际运行效率有影响,这里不做讨论。为了简单起见,这里选第一个元素作为主元。
一次分区完成后,再对两个分区分别再进行分区操作,以此形式进行递归,最后直到分区只有一个元素时递归结束,所得数组即为排好序的数组。
代码:
#include <iostream>
#define LEN 100
using namespace std;
int partition(int a[], int p, int q)
{
int i = p;
for(int j = p+1; j<=q; j++){
if(a[j]<a[p]){
swap(a[j], a[i+1]);
i++; // i始终小于j, 所以只要保证j的上限即可以保证a[i+1]不会越界
}
}
swap(a[i], a[p]); //将主元放于两个分区之间
return i;
}
void qsort(int a[], int p, int q)
{
if(p<q){
int i = partition(a, p, q);
qsort(a, p, i-1);
qsort(a, i+1, q);
}
}
main()
{
int n, A[LEN];
while(scanf("%d", &n) != EOF){
for(int i=0; i<n; i++){
cin >> A[i];
}
qsort(A, 0, n-1);
for(int i=0; i<n; i++){
cout << A[i] << ' ';
}
printf("\n");
}
}