冒泡排序是基础的入门算法。它每次将最大的数放到高位,就像气泡向上一样。算法比较相连的两个数,如果大数在前则对调它们,每次产生一个待排序中的最大的数。
每次产生最大的一个数,那么n个数则需要产生n-1个数即可,也就是说一共需要进行n-1次趟,第一趟待比较的数是n个,连续的两两比较,那就需要进行n-1次比较,第二趟时待比较数为n-1,那么就需要n-2次比较。
#include <stdio.h>
void print_arr(int *arr,int len)
{
int i = 0;
for (;i < len;i++)
{
printf("%d%s", *arr++, " ");
}
printf("%c",'\n');
}
/**
* @brief bubble_sort 冒泡排序
* @param arr
* @param len
*/
void bubble_sort(int *arr, int len)
{
int i = 0;
int j = 0;
int t = 0;
bool flag = true;
for (;i < len - 1;i++)
{
flag = true;
for (j = 0;j < len - 1 - i;j++)
{
if (arr[j] > arr[j+1])
{
t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
flag = false;
}
}
if (flag)
{
break;
}
}
}
int main(void)
{
printf("Hello World!\n");
int arr[] = {1,3,-3,47,34,6};
bubble_sort(arr,6);
return 0;
}
如果一趟没有调换发生则说明已经排序完成,这里引入了一个bool型的变量flag,每趟都置true,如果发生调换置false,在每趟结束来检测这个值就行了。
冒泡排序最好的情况下是有序的,只进行一趟,即n个数据,则比较次数为n-1,最坏为逆序,需要进行n-1趟,每次需要比较n-i(1≤i≤n-1)次。
冒泡排序是稳定的,它不会破坏排序中值相同的元素的前后位置。