C语⾔中的经典排序算法——冒泡排序
冒泡排序
“冒泡”⾃然是泡泡越升⾼泡泡也就越⼤,所以冒泡排序就是每次将最⼤的数放到最后,再确定第⼆⼤的数放在倒数第⼆位,以此类推,需要经过N-1次的外层循环,⽅能排完。
先介绍我们平时⽐较多见的冒泡排序,时间复杂度为O(N²),,空间复杂度为O(1)
#include<stdio.h>
int main()
#define N 50
{
int a[N];
int n;
int temp;
printf("请输⼊要排序的数字个数:");
scanf("%d",&n);
for(int i = 0;i<n;i++)
{    //输⼊要排序的整数
scanf("%d",a+i);
}
for(int i = 0;i<n-1;i++)//n个整数排序
{    //需要经过n-1趟
for(int j = 1;j<n;j++)
{
if(a[j-1]>a[j])//将较⼤的数字后移(交换数字)
{
temp = a[j-1];
a[j-1] = a[j];
a[j] = temp;
}
}
}
printf("冒泡排序后的顺序是:\n");
for(int i = 0;i < n;i++)
printf("%d\t",a[i]);
return 0;
}
运⾏实例结果:
冒泡排序的缺点很明显,如果输⼊的数字已经有序,程序的时间复杂度仍然是O(N²),因此可以将冒泡排序优化些许,增加⼀个开关就可以避免这种情况发⽣;这样的话,序列越是有序,则时间复杂度会趋于O(N),以下为改进后的代码:
#include<stdio.h>
int main()
#define N 50
{
int a[N];
int n;
int temp;
int flag; //这个就是定义的开关变量
printf("请输⼊要排序的数字个数:");
scanf("%d",&n);
for(int i = 0;i<n;i++)
{    //输⼊要排序的整数
scanf("%d",a+i);
}
for(int i = 0;i<n-1;i++)//n个整数排序
{
flag = 1;
for(int j = 1;j<n;j++)
{
if(a[j-1]>a[j])
{      //将较⼤的数字后移(交换数字)
temp = a[j-1];
a[j-1] = a[j];
c语言的冒泡排序算法a[j] = temp;
flag = 0;
}
}//若果flag==1表明后⾯的数字是有序的,可以直接跳出排序  if(flag==1)
break;
}
printf("冒泡排序后的顺序是:\n");
for(int i = 0;i < n;i++)
printf("%d\t",a[i]);
return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。