资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
用递归来实现快速排序(quick sort)算法。快速排序算法的基本思路是:假设要对一个数组a进行排序,且a[0] = x。首先对数组中的元素进行调整,使x放在正确的位置上。同时,所有比x小的数都位于它的左边,所有比x大的数都位于它的右边。然后对于左、右两段区域,递归地调用快速排序算法来进行排序。
输入格式:输入只有一行,包括若干个整数(不超过10个),以0结尾。
输出格式:输出只有一行,即排序以后的结果(不包括末尾的0)。
输入输出样例
样例输入
5 2 6 1 7 3 4 0
样例输出
1 2 3 4 5 6 7
解题思路:
解决这道题最重要的是理解快速排序的过程,菜鸟教程上有该算法的详细的步骤https://www.runoob.com/w3cnote/quick-sort.html
,本质就是不断填坑,首先将最左边的数挖出,然后从最右边开始向左找比挖出来的数小的填上去,然后再从左边向右找到比初始坑大的数填到刚才挖的坑,反复直到相遇,然后在各自的区间再重复做这样的事情,代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[10];
void quick_sort(int s[], int l, int r){
if(l < r){
int i = l;
int j = r;
int x = s[l];
while(i < j){
while(i < j && a[j] >= x){
j --;
}
if(i < j){
s[i ++] = s[j];
}
while(i < j && a[i] < x){
i ++;
}
if(i < j){
s[j --] = s[i];
}
}
s[i] = x;
quick_sort(s, l, i - 1);
quick_sort(s, i + 1, r);
}
}
int main(){
int index = 0;
int num;
while(1){
cin >> num;
if(num == 0){
break;
}
a[index ++] = num;
}
quick_sort(a, 0, index - 1);
for(int i = 0; i < index; i ++){
cout << a[i] << " ";
}
return 0;
}