前言
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。是一种稳定的排序算法,其平均时间复杂度为O()。
原理
我的理解
比较相邻的两个元素,若当前元素比后一个元素大(或者小,取决于要按从小到大排序还是从大到小排序),则交换,这样一轮循环都会选出一个相对最大的数,放在数组末尾,重复上述操作,直到进行了n-2次排序(要排序的元素个数)。
当然,一般来说,冒泡排序是从数组开始位置扫描,即下标为0,也可以从数组末尾往前扫描,排序好的元素放在数组左边,更重要的是学习冒泡排序的思想,即相邻元素的比较与交换。
百度百科
c语言代码
对a[n]进行冒泡排序,按非递减(从小到大)排序
从左往右扫描
若要按非递增(从大到小)排序,if条件改成a[j]<a[j+1]即可
#include<stdio.h>
int main(){
int n;
int a[n];
int i,j;
for(i=0;i<n-1;i++){
for(j=0;j<n-1-i;j++){
if(a[j]>a[j+1]){
int t;
t=a[j];
a[j]=a[j+1];
a[j+1]=a[j];
}
}
}
return 0;
}
从右往左扫描
若要按非递增(从大到小)排序,if条件改成a[j]>a[j-1]即可
#include<stdio.h>
int main(){
int n;
int a[n];
int i,j;
for(i=0;i<n-1;i++){
for(j=n-1;j>i;j--){
if(a[j]<a[j-1]){
int t;
t=a[j];
a[j]=a[j-1];
a[j-1]=a[j];
}
}
}
return 0;
}
从左往右扫描解释
为什么外层循环是执行n-1次呢?
假设要对2个数排序,外层循环每执行一次,总能有一个数完成排序,或者说总能在没完成排序的数中,选出一个最大或最小的数,即每执行一次外层循环,总有一个数完成排序,未完成排序的数剩下1个时,则相当于排序完成,2个数则需要进行1次外层循环,3个数需要3-1=2次外层循环,4个数需要4-1次外层循环,n个数需要n-1次外层循环。
将数组看成两部分,左边是未完成排序的元素,右边是完成排序的元素,每次外层循环结束,未完成排序元素-1,完成排序元素+1,未完成排序元素剩下1个时,就等同于完成排序,所以为n-1次外层循环
为什么外层循环是j<n-i-1呢?
对内层循环来说,i是已经排序好的元素个数,我们可以这样理解,n-1-i,n-1是数组a最后一个元素的下标,n-1-i,a[n-1-i]是后面所有元素都是已经排完的,a[n-1-i]和其前面的元素都是待排序的。
举一个例子,假设n=5,i=2,n-1-i=2。a[3],a[4]就是已经排序好的元素,而交换两元素的值,内层循环只需要在a[1]和a[2]判断是否交换,所以再-1,即j只能到n-i-1-1,所以j<=n-i-2,就是j<n-i-1。其实j=n-i-1,也是可以的,只是这样毫无意义,因为当j=n-i-1时,a[j]和a[j+1]分别为a[n-i-1]和a[n-i],而a[n-i]是属于已经完成排序的元素,必然在前面的比较中,已经确定了a[n-i-1]的大小关系。