课程29_10 1041 简单排序2
题目:
题目描述
题目描述:
给定 20 个无序的整数,请将其按照从小到大的顺序排序并输出
输入描述:
输入仅一行,其中包含 20 个整数,中间用空格分开
输出描述:
输出为 20 行,每行一个整数,整个输出形成一个从小到大排列的竖式
样例输入:
9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4-5 -6 -7 -8 -9 -10
样例输出:
-10
-9
-8
-7
-6
-5
-4
-3
-2
-1
0
1
2
3
4
5
6
7
8
9
解析:
好久没来写题解了,捡起来再写写。
题如其名,比较简单的一题,给20个数字排序。因为题目已经告诉你一组只有20个数据,所以我们用最简单的冒泡排序就可以了。
如果还有同学不知道冒泡排序是什么的,我可以再解释一次:
冒泡排序是最最俭朴的比较排序了。所谓比较排序,就是基于比较两个数字(一般是临位,就是紧挨着的两个)的大小,然后以此来排序的算法。
冒泡排序的思路大概是这样的:(我们用d(n)表示第n个数字)
首先比较d(1)和d(2),如果d(1)>d(2),就交换这两个数字,那么此时d(1)一定小于d(2)。
然后我们再比较d(2)和d(3),如果d(2)>d(3),就交换他们,那么此时d(2)一定小于d(3),并且d(3)一定是前三个数字里最大的。
以此类推,我们一直比较到数组结尾的地方,那么此时,数组的最后一个数字一定是最大的。在这个过程中,目前数组最大的数字逐步的“冒”到了上面,就像是气泡冒了上去一样,这也是这个算法的名字由来。
此时,我们已经完成了冒泡排序的第一个循环。
如你所见,我们进行完第一个循环以后,就有一个数字的位置确定了,也就是最后一个数字。而其他的数字还没有确定下来。虽然在过程中,d(3)>d(2),d(2)>d(1),但是循环后,d(2)不一定大于d(1),因为在这个过程中,他们的数据可能发生了变化(因为交换)。
那么我们从第一个开始,到倒数第二个(因为倒数第一个已经排好了),这样倒数第二个也排好了,以此类推,直到所有数据都排序好。
解题:
用一个数组来管理会很方便,然后冒泡即可,注意内层循环的次数是20-i-1,因为每循环一次,就有一个数字被排序好。
参考代码:
// TSOJ-1041 简单排序2
#include <iostream>
using namespace std;
int main()
{
int n[20],temp;
for(int i=0;i<20;i++)
cin>>n[i];
for(int i=0;i<20;i++){
for(int j=0;j<20-i-1;j++){
if(n[j]>n[j+1]){
temp = n[j];
n[j] = n[j+1];
n[j+1] = temp;
}
}
}
for(int i=0;i<20;i++)
cout<<n[i]<<endl;
return 0;
}