冒泡排序概述
冒泡排序(Bubble Sort)属于交换排序。它重复地遍历要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的遍历操作,直到没有要交换的数据元素为止。
交换排序是通过对比两个元素的值,按照自己的需求来判断是否需要交换两个元素的位置。例如,a[2] = {0,1};现要求从大到小排序,0和1经过对比后,0的索引需改为1,1的索引需改为0。
核心思想和基本步骤
核心思想
冒泡排序的基本思想是在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两数,否则不交换;如此下去,直至最终完成排序。在冒泡排序中以升序为例,冒泡排序算法将待排序的n个数中相邻两个数进行比较,将较大的数交换到后面的一个位置上。
重复这一操作,直到处理完本轮数列中最后两个元素,称为一轮排序。当一轮排序完成时,最大的数就被轮换到本轮排序数列最右端位置上。重复上面的过程,经过n-1轮后,就实现了数据升序排序。
基本步骤
两两比较:以升序为例,比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
重复比较:针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码及其运行效果
代码如下
#include<stdio.h>
void BubbleSort(int *arr,int n){
//两两比较n轮,必须得到有序数组
for(int i = 0; i < n; i++){
//用于换位的中间值
int temp = 0;
//用于判断是否排序完成,能否提前退出循环
int flag = 0;
for(int j = 0; j < n-i-1; j++){
//相邻元素两两比较,按条件交换位置
if(arr[j] > arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = 1;
}
}
//如果完成排序,则flag不会被赋值为1,可以退出循环
//不用temp判断,是避免偶然现象,交换数据为0时,temp也可能为0
if(flag == 0){
break;
}
}
}
int main(){
int arr[10] = {5,6,1,4,3,8,2,7,10,9};
//改变数组内容,不需要更改长度
//改变类型,把4改为该类型对应的字节数
int len = sizeof(arr)/4;
//参数:数组、数组长度
BubbleSort(arr,len);
for(int i = 0; i < len; i++){
printf("%d\t",arr[i]);
}
return 0;
}
运行效果
注:冒泡排序的时间复杂度为O()。如果有错误的地方,敬请指正,谢谢你的观看。