快速排序 | ||
---|---|---|
Time Limit: 1000 MS | Memory Limit: 1000 KB |
Description
给定一维int型数组a[0,1,...,n-1], 使用快速排序方法, 对其进行从小到大排序。
划分时请用第1个元素作为划分基准,并只使用一个数组
Input
输入第1行有一个int型正整数m (m<100), 表示有m行输入.
每行输入的第一个数为int型正整数n (8<n<1000), 后面接着输入n个int型整数.
Output
对每组数据, 输出自顶自下第二层的划分结果.
Sample Input
2
11 6 3 7 8 5 1 4 2 4 9 10
12 6 3 7 8 4 5 1 11 2 4 9 10
Sample Output
1 2 3 4 4 5 6 7 8 9 10 1 2 3 4 4 5 6 7 8 9 10 11
#include <iostream>
using namespace std;
void quicksort(int a[], int begin, int end); //函数声明
int main()
{
int n, N;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
quicksort(a, 0, n - 1);
for (int i = 0; i < n; i++) {
cout<< a[i]<<" ";
}
cout <<endl;
}
}
void quicksort(int a[], int begin, int end) { //函数定义
if (begin >= end) { return; } //递归终止条件
int i = begin, j = end; int mid = begin; //mid用来记录第一个元素在排序过程中的位置,i,j分别为数组两头的指针
while (i < j) { //以该数组中的第一个元素作为划分依据,
//比第一个元素小的放到左边,比第一个元素小的放到右边
if (a[i] <= a[j]) {
if (mid == i) { //mid在左边
j--; //移动的一直是mid对面的指针
}
else if (mid == j) { //mid在右边
i++;
}
}
else if (a[i] > a[j]) { //mid在左边
if (mid == i) {
int t = a[i]; //交换位置(交换后mid在右边)
a[i] = a[j];
a[j] = t;
mid = j;
i++; //mid对面的指针移动,即左边指针右移
}
else if (mid == j) { //mid在右边
int t = a[i];
a[i] = a[j];
a[j] = t;
mid = i;
j--;
}
}
}
quicksort(a, begin, mid - 1); //递归划分为左右两个子问题继续求解
quicksort(a, mid+1, end);
}