一、问题描述
将12,35,99,18,76这5个数进行从大到小的排序。
二、思路解析及冒泡排序
上边题目要求是从大到小排序,那么也就是说越小的越靠后。
1.一趟排序(归位了12,12就是最小的)
首先比较12和35,小的要靠后,交换顺序。成为35,12,99,18,76.
继续比较12和99,继续交换,顺序成为35,99,12,18,76
继续比较12和18,继续交换,顺序成为35,99,18,12,76
继续比较12和76,继续交换,顺序成为35,99,18,76,12.
2.第二趟归位结果是99,35,76,18,12(归位的数是18)
3.第三趟归位结果是99,76,35,18,12(归位的数是35)
4.第四趟归位结果同上(归位的是76)
总结:如果有n个数进行排序,需要进行n-1趟操作,需要将n-1个数归位。
冒泡排序的基本思想:每次比较两个相邻的元素,如果它们顺序错误就把它们交换过来。
三、代码复现
#include<stdio.h>
int main(){
int a[100],i,j,t,n;
scanf("%d",&n);//输入一个数n,表示接下来有n个数
for(i=1;i<=n;i++)//循环读入n个数到数组a中
scanf("%d",&a[i]);
//冒泡排序的核心部分
for(i=1;i<=n-1;i++){
//n个数进行排序,只需要进行n-1趟
for(j=1;j<=n-i;j++){
//从第1位比较到最后一个尚没有归位的数,到n-i就可以了
if(a[j]<a[j+1]){
//比较大小,从大到小排序,把小的换在后边
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
//输出结果
for(i=1;i<=n;i++){
printf("%d ",a[i]);
}
getchar();getchar();
return 0;
}
四、时间复杂度分析
冒泡排序的一个特点就是加粗样式双重循环。
时间复杂度是O(N的平方)。
编码过程中遇到的一些问题:
忘记加空格,忘记加%号。一点小错误,但是导致首次运行不通。
还有就是底层始终都是基础中的基础。
一些学习链接