冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地交换相邻的元素,将较大的元素“冒泡”到数组的末尾。
给定一个乱序数组7,1,9,5,2,6,4降序排列
首先要比较相邻两个元素的大小,然后如果满足前一个数大于后一个数则交换
第一趟
7>1,交换得1,7,9,5,2,6,4
第二次1,7,9,5,2,6,4
第三次1,7,5,9,2,6,4
.......
最后直到变为1,7,5,2,6,4,9
第二趟
直到1,5,2,6,4,7,9
以此类推
直到六趟后整个数组变为
1,2,4,5,6,7,9
至此数组有序且降序
根据以上,我们不难发现,一个长度为n的数组,最多经过n-1趟后,数组有序
每一趟最多排序n-1-i(趟数)次
#include <stdio.h>
void bubblesort(int* arr, size_t n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
void printarr(int* arr, size_t n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 7,1,9,5,2,6,4 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubblesort(arr, sz);
printarr(arr, sz);
}
运行结果
当我给到一个数组9,0,1,2,3,4,5时我们可以发现其实循环只用走一趟,数组就能有序,大大减少运行时间,所以我们可以先让循环走一次把9放到最后,然后再走一次判断此时数组是否有序
代码示例
#include <stdio.h>
void bubblesort(int* arr, size_t n)
{
int flag = 1;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
}
if (flag == 1)
break;
}
}
void printarr(int* arr, size_t n)
{
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 9,0,1,2,3,4,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubblesort(arr, sz);
printarr(arr, sz);
}
运行结果