冒泡排序
“冒泡”自然是泡泡越升高泡泡也就越大,所以冒泡排序就是每次将最大的数放到最后,再确定第二大的数放在倒数第二位,以此类推,需要经过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];
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;
}