冒泡排序C语言

前言

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。是一种稳定的排序算法,其平均时间复杂度为O(n^{2})。

原理

我的理解

比较相邻的两个元素,若当前元素比后一个元素大(或者小,取决于要按从小到大排序还是从大到小排序),则交换,这样一轮循环都会选出一个相对最大的数,放在数组末尾,重复上述操作,直到进行了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]的大小关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值