1.冒泡排序就行水中的气泡一样,气泡最大的在最上面,
对整型数组中,相邻两个元素进行比较,大的放在右边;
2.外循环是需要有多少组:i=len-1,因为最后一组时,只有自己一个元素,不需要和其它元素进行比较;
3.内循环是每组内部内部相邻元素进行比较,需要比较次数是:j=len-i-1,因为每组比较时最终都有一个最大元素值,不需要进行相邻元素比较了;
#include <stdio.h>
// 缺点是后续数据是有序的,还需要进行比较
int BubbleSort(int array[], int len)
{
int i = 0;
int j = 0;
int temp = 0;
// 组循环
for (i = 0; i < len - 1; i++)
{
/*组内元素比较,比较结果元素都在最右边变为有序列,
所以是len-i-1
*/
for (j = 0; j < len - i - 1; j++)
{
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
return 0;
}
/* 优化,增加标识,若已经是有序的话,外循环剩余的不需要继续进行遍历比较*/
int BubbleSortNew(int array[], int len)
{
int i = 0;
int j = 0;
int temp = 0;
for (i = 0; i < len - 1; i++)
{
int flag = 1; // 1-默认每组比较时是有序;
//组内元素比较
for (j = 0; j < len - i - 1; j++)
{
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
flag = 0; // 若是无序,则置为0
}
}
// 若是有序,则后续不需要进行比较,直接退出循环,减少不必要的比较
if (flag)
{
break;
}
}
return 0;
}
int main()
{
int i = 0;
int array[8] = {5, 3, 8, 2, 6, 1, 4, 7};
BubbleSortNew(array, 8);
for (i = 0; i < 8; i++)
{
printf("%d ", array[i]);
}
return 0;
}