最基础的冒泡排序:(C语言)
#include<stdio.h>
int main()
{
int num = 10;//定义了排序数字的数量
int a[num];
for(int i=0;i<num;i++)
{
scanf("%d",&a[i]);//输入需要排序的数字
}
for(int i=0;i<num-1;i++)//进行冒泡排序
{
for(int j=0;j<num-1-i;j++)
{
if(a[j]>a[j+1])//对二者值进行交换
{
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for(int i=0;i<num;i++)
{
printf("%d ",a[i]);
}
}
对于下面的核心代码,外层的排序(也就是排序的总轮数)是比需要排序的数的数量少1的,这个不是记忆性的东西,实际上在纸上写写就可以理解了:比如第一轮第一大的放在最后一位,第二轮第二大的放在倒数第二位...那么依次下去,第九大的放在倒数第九位,这时候其实就不用比了,因为最后一位一定是最小的,算下来一共只比了九次。
这时候有小机灵鬼就会问了:我就想比较10轮会怎么样?——其实不会影响结果,你会发现内层的for循环就直接不执行了,因为不满足j<num-1-i的条件。只比较9轮是因为优化问题,提高代码执行效率。
内层的排序:对于num-1-i,这个减1其实排除掉自己比自己,减i是为了避免与已经排好的那个最大的元素进行比较,提高代码执行效率。if代码块里面是一个交换功能。
for(int i=0;i<num-1;i++)//进行冒泡排序
{
for(int j=0;j<num-1-i;j++)
{
if(a[j]>a[j+1])
{
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
基础的冒泡排序其实还可以小优化一下,如果我经历了几轮排序后,我发现元素已经全都排好序了,那就不用进行下面的排序了。那我们应该怎么知道元素排没排好序呢?这时候需要引入一个标志用来判断:
for(int i=0;i<num-1;i++)//进行冒泡排序
{
int flag = 0;//定义标志
for(int j=0;j<num-1-i;j++)
{
if(a[j]>a[j+1])
{
flag = 1;//发生了交换
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
if(flag == 0) break;//没有发生交换那就break跳出排序
}
最后,我的这个排序写的是从小到大排序,如果要从大到小的话,只需要把内层循环if语句里面的大于号改为小于号就行了。
&spm=1001.2101.3001.5002&articleId=144123404&d=1&t=3&u=db9faa40d3e44441bc4fd5045c701d14)
39万+

被折叠的 条评论
为什么被折叠?



