Problem Description
输入一组数据的个数,然后输入这组数据,排序后输出结果。要求使用快速排序。
Input
首先输入数组元素的个数N,然后在接下来的一行里输入数组元素的值,并以空格隔开。
Output
输出排序后数组的值。
Sample Input
10
2 7 5 3 8 4 0 6 1 9
Sample Output
0 1 2 3 4 5 6 7 8 9
解题思路
代码实现(C)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define MaxSize 1000
// 交换两个数的值
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 选取随机主元,对区间[left,right]进行划分
int randPartition(int left, int right, int A[]) {
// 生成随机数种子
srand((unsigned) time(NULL));
// 生成[left,right]范围内的随机数p
int p = (int) round((1.0) * rand() / RAND_MAX * (right - left) + left);
// 交换A[left]和A[p]
swap(&A[left], &A[p]);
int temp = A[left]; // 将A[left]存放至临时变量temp
while (left < right) { // left == right,即枢轴位置
while (left < right && temp < A[right]) right--; // 反复左移right
A[left] = A[right]; // 将A[right]挪到A[left]
while (left < right && A[left] <= temp) left++; // 反复右移left
A[right] = A[left]; // 将A[left]挪到A[right]
}
A[left] = temp; // 把temp放到left与right相遇的地方
return left; // 返回相遇的下标
}
// 快速排序,left与right初值为序列首尾下标(如1与n)
void quick_sort(int left, int right, int A[]) {
if (left < right) { // left == right时,区间只有一个元素
int pivot = randPartition(left, right, A); // 将[left,right]按A[left]一分为二
quick_sort(left, pivot - 1, A); // 对左子区间递归进行快速排序
quick_sort(pivot + 1, right, A); // 对右子区间递归进行快速排序
}
}
int main() {
int N, num[MaxSize];
while (~scanf("%d", &N)) {
// 录入数据
for (int i = 0; i < N; ++i)
scanf("%d", &num[i]);
// 快排
quick_sort(0, N - 1, num);
// 打印输出
for (int i = 0; i < N; ++i) {
if (i < N - 1)
printf("%d ", num[i]);
else
printf("%d\n", num[i]);
}
}
return 0;
}