高级冒泡排序
#include <stdio.h>
int main()
{
int a[] = { 1,2,3,4,5,6,7,9,8,5 };//3,2,4,1,23,23,24,47,17,13,58
int len = sizeof(a)/4;//sizeof是拿到内存分配的大小,需要除以基本类型
for (int i = 0;i<len-1;i++)
{
//用来判断是否已经完成排序
int flag = 0;
for (int j = 0;j < len-1-i; j++)
{
//当前面的值大于后面时,就需要交换
if (a[j] > a[j+1])
{
int k = a[j];
a[j] = a[j + 1];
a[j + 1] = k;
flag = 1;
}
}
if (!flag)
{
//测试这个flag是否有用
printf("结束:%d\n", i);
break;
}
}
//输出排序结果
for (int i = 0; i < len; i++)
printf("%d\n",a[i]);
return 0;
}
高级冒泡排序
1.有一个flag来判断是否已经完成排序,当你i一轮执行下来没有交换数据,证明已经排序完成;
2.第一个for循环(即外层循环)是根据数组的个数减去1来决定外层循环的次数;
3.第二个for循环(即内层循环)是根据2个原因来决定内层循环的次数:
a.数组的个数-1;
b.并且因为每次i循环后,数组最后一个元素会排序好,所以需要减去i;