冒泡排序
一、概述
冒泡排序的排序思路是:
- 通过无序区的相邻元素的比较和位置的交换,使最大的元素往上移动
- 每一轮排序选出无序区的最大的元素,加入有序区中
- 不止可以得到升序排序,稍微改变下交换逻辑也可以得到降序排序
二、举例详解
例如,对无序表{49,38,65,97,76,13,27,49}
进行升序排序的具体实现过程如图 1 所示:
图 1 第一次起泡
由于 97 已经判断为最大值,所以第二次冒泡排序时就需要找出除 97 之外的无序表中的最大值,比较过程和第一次完全相同。第二次起泡如图二所示,后面多次起泡和这个同理
图 2 第二次起泡
三、算法实现
#include <stdio.h>
/*
冒泡排序的排序思路是:
通过无序区的相邻元素的比较和位置的交换,使最大的元素往上移动
每一轮排序选出无序区的最大的元素,加入有序区中
*/
void bubble_sort(int value[],int n)
{
//n-1轮排序 (排序n-1轮剩下的那个数自然是最小的)
for(int i=0; i<n-1; i++)
{
//每一轮排序选出无序区的最大的元素,加入有序区中
//循环终止条件是 j<n-i-1
//n代表数组总共有n个数,i表示已经有i个排序好了
//因为每次是和后面的元素比较,所以要 -1 (防止数组越界)
for(int j=0; j<n-i-1; j++)
{
//每一次和后一个元素,进行比较,较大的后移
if( value[j] > value[j+1])
{
//交换两个元素的值
int temp = value[j];
value[j] = value[j+1];
value[j+1] = temp;
}
}
}
}
int main()
{
int value[] = {8,3,6,2,4,5,7,1,9,0};
printf("排序前的数据为:\n");
for(int i=0; i<10;i++)
printf("%d ",value[i]);
printf("\n\n");
bubble_sort(value,10);
printf("排序后的结果为:\n");
for(int i=0; i<10;i++)
printf("%d ",value[i]);
printf("\n");
return 0;
}
运行结果:
算法分析:
排序方法 | 时间复杂度(平均) | 时间复杂度(最坏) | 时间复杂度(最好) | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n2) | O(n2) | O(n) | O(1) | 稳定 |
关于冒泡排序算法的改进参考我的另一篇博文:链接
参考来源:
http://c.biancheng.net/view/3444.html