编程序,读入n个整数(n<30),对它们进行从小到大快速排序,并输出每一轮排序后的结果。
n个整数。
每一轮排序后的结果。注意:整数之间有1个空格,最后一个整数后面没有空格。
6 7 8 0 4 3 5 9 1 2
2 1 5 0 4 3 6 9 8 7 0 1 2 5 4 3 6 9 8 7 0 1 2 5 4 3 6 9 8 7 0 1 2 3 4 5 6 9 8 7 0 1 2 3 4 5 6 9 8 7 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
分析:
快速排序采用的是分治的思想
在算法设计中,我们引入分而治之的策略,称为分治算法,其本质就是将一个大规模的问题分解为若干个规模较小的相同子问题,分而治之。
快速排序的算法思想:
通过一组排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小,然后再按此方法对这两部分数据进行快速排序,整个排序过程可以递归进行,以此使所有数据变成有序序列。
1.先取第一个元素为基准flag(一般情况)
2.从右往左扫描,找到小于flag的元素,然后a[j]和a[i]进行交换,i++
3.从左往右扫描,找到大于flag的元素,然后a[i]和a[j]进行交换,j--
4.一直重复2,3步骤,直到i大于等于j时结束该轮的排序
5.分别递归左序列和右序列,进行每一轮的排序
代码:
# include <iostream>
#define bug(a) (cout<<"*"<<a<<endl)
using namespace std;
int a[33], count=0;
void Quicksort(int a[], int sz,int left,int right)
{
int i, j;
i = left;
j = right;
int flag = a[left];
if (i > j) {
return;
}
while (i !=j) {
while (i<j && a[j]>=flag) {
j--;
}
a[i] = a[j];
while (i < j && a[i] <= flag) {
i++;
}
a[j] = a[i];
}
a[i] = flag;
for (int i = 0; i < sz; i++)
cout << a[i] << ' ';
cout << endl;
if (i - 1 > left) {
Quicksort(a, sz, left, i - 1);
}
if (i + 1 < right) {
Quicksort(a, sz, i + 1, right);
}
}
int main()
{
while (cin >> a[count++]);
count--;
Quicksort(a, count,0,count-1);
return 0;
}