博客园的第一篇博客,就先来记录一下最简单的冒泡排序吧。
冒泡排序是交换排序的一种,下面是冒泡排序的一些特征:
- 平均时间复杂度:O(n^2)
- 最坏情况:O(n^2)
- 最好情况:O(n)
- 平均空间复杂度,最好最坏平均都为:O(1)
- 是否稳定:稳定
冒泡排序的一次循环会将一个最小的元素放到排好序的最终位置上
话不多说,函数代码如下:
/**
* arr 为需要排序的数组名
* len 为数组长度
*/
void bubble_sort(int arr[], int len)
{
int i, j;
int flag = 0; // 标记一趟过后是否有元素交换
for (i=0; i<len-1; i++) {
flag = 0;
for (j=len-1; j>i; j--) {
if (arr[j-1] > arr[j]) {// 如果前者比后者大,则交换两者
int temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
flag = 1; // 标记有元素交换过了
}
}
if (!flag) // 若一趟过后元素未交换过,说明已经排好序
break;
}
}
简单的测试代码如下,直接保存代码编译即可:
#include <stdio.h>
/**
* arr 为需要排序的数组名
* len 为数组长度
*/
void bubble_sort(int arr[], int len)
{
int i, j;
int flag = 0; // 标记一趟过后是否有元素交换
for (i=0; i<len-1; i++) {
flag = 0;
for (j=len-1; j>i; j--) {
if (arr[j-1] > arr[j]) {// 如果前者比后者大,则交换两者
int temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
flag = 1; // 标记有元素交换过了
}
}
if (!flag) // 若一趟过后元素未交换过,说明已经排好序
break;
}
}
void show(int arr[], int len)
{
int i;
for (i=0; i<len; i++) {
printf("%4d", arr[i]);
}
printf("
");
}
int main()
{
int n = 4;
int arr[] = {7, 10, 11, 9};
bubble_sort(arr, n);
show(arr, n);
return 0;
}