第九章城主府领奖之冒泡排序
Posted 炎龙工作室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第九章城主府领奖之冒泡排序相关的知识,希望对你有一定的参考价值。
第九章城主府领奖之冒泡排序
从小到大的冒泡排序,就是说每一个变量像水里的气泡,两个变量进行比较,大的沉下去,小的浮上来。用循环把所有的数字都扫描一遍,最后完成了排序。
输入:7
8 4 3 9 7 5 6
输出:3 4 5 6 7 8 9
分析:
第一步输入。先搞清楚7的含义。第一个数字7,代表下面有7个数据需要存储到数组里。设定数组a[10],只用到7。
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i];
}
第二步比较排序。
第一遍扫描比较6次:
8和4进行比较,8>4,则交换。
8和3进行比较,8>3,则交换。
8和9比较,8<9,不进行交换。
9和7进行比较,9>7,则交换。
9和5进行比较,9>5,则交换。
9和6进行比较,9>6,则交换。
第二遍扫描比较5次:
4和3进行比较,4>3,则交换。
4和8进行比较,4<8,不进行交换。
8和7进行比较,8>7,则交换。
8和5进行比较,8>5,则交换。
8和6进行比较,8>6,则交换。
第三遍扫描比较4次:
3和4进行比较,3<4,不进行交换。
4和7进行比较,4<7,不进行交换。
7和5进行比较,7>5,则交换。
7和6进行比较,7>6,则交换。
第四遍扫描比较3次:
3和4进行比较,3<4,不进行交换。
4和5进行比较,4<5,不进行交换。
5和6进行比较,5<6,不进行交换。
第五遍扫描比较2次:
3和4进行比较,3<4,不进行交换。
4和5进行比较,4<5,不进行交换。
第六遍扫描比较1次:
3和4进行比较,3<4,不进行交换。
完整的程序:
#include<stdio.h>
int a[10],n,tmp;
main(){
scanf("%d",&n);
for(int i=0;i<n;i++){//申请使用数组空间,注意n不要超过10啊!
scanf("%d",&a[i]);
}
for(i=0;i<n;i++){ //注意这里代表比较第几遍扫描
for(j=0;j<n-i;j++){//注意这里代表比较的次数,要把已经比较完成的空间减去
if(a[j]>a[j+1]){//前后两个数进行比较
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
for(i=0;i<n;i++){
printf("%d ",a[i]);//输出排序完成后的结果,中间加了空格。
}
return 0;
}
从大到小的冒泡排序,只要改变一下比较语句里的符号if(a[j]<a[j+1])即可,不再提供完整程序。
远航终于明白了扫描比较的规律!7个数字排序要扫描6遍,每遍的次数是6、5、4、3、2、1,都加起来就是21次。在程序的后面有连续数字相加的秘诀:首位数字相加的和乘以个数除以2。是不是很难看懂这句话,远航把数字套上去一看算式就明白了:
(6+1)*6/2=7*6/2=42/2=21 注意:首位是6,个位是1,个数是6
101个数字排序的话,是要扫描100遍,要比较多少次呢?
(1+100)*100/2=5050
计算机就有这个好处,不怕累,任劳任怨。要是让人来做的话,还不得疯了啊。
远航还有一个疑惑,书上给出的程序扫描完第三遍的时候,就已经排序好了。后面的扫描都是无用的,有改进的方法吗?
每扫描一、二、三遍至少会有一次数字交换,而后面四、五、六次一次数字交换也没有。扫描一遍没有发生数字交换的时候,说明排序已经完成了。这样就不用再扫描了。远航分析出规律来,就想添加一个判断变量。每次扫描刚开始设定判断变量flag=0,代表没有发生数字交换;如果在比较中进行了数字交换,就要设定判断变量flag=1。即然是判断变量还要在扫描条件里添加上一条i<n&&flag==0,这样就完美了!
int flag=0;
for(i=0;i<n&&flag==0;i++){ //注意这里代表比较第几遍扫描
flag=0;
for(j=0;j<n-i;j++){//注意这里代表比较的次数,要把已经比较完成的空间减去
if(a[j]>=a[j+1]){//前后两个数进行比较
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
flag=1;
}
}
}
远航感觉到个冒泡排序大法和自己前面学习的三个数字排序还不太一样。三个数字排序的规律是前面始终存放最大的数字。
以上是关于第九章城主府领奖之冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章