排序:冒泡排序

冒泡排序

每一轮两两之间比较,选出最大或最小值放末尾
整体比较轮次数:length - 1 轮
j < length - 1 - i 含义:每过一轮最后一个数就不用比较,就是比较的数减少一个。一轮后减一,二轮后减二,i - 1轮后减i - 1

时间复杂度:O()
n个记录,第i轮需要比较n-i次,总共需要n-1
void BubbleSort(int a[], int length) {
	//升序排序,每次选出最大的数排在末尾
	for (int i = 0; i < length - 1; i++) {//总共比较的轮次 length - 1次
		for (int j = 0; j < length - 1 - i; j++) {//每一轮比较的次数
			if (a[j] > a[j + 1]) {
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
	//降序排序,每次选出最小的数排在末尾
	for (int i = 0; i < length - 1; i++) {//总共比较的轮次 length - 1次
		for (int j = 0; j < length - 1 - i; j++) {//每一轮比较的次数
			if (a[j] < a[j + 1]) {
				int temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;}
		}
	}
}
int main()
{
	int a[6] = {3,2,4,6,1,5};
	int length = sizeof(a) / sizeof(int);
	BubbleSort(a,length);
	for (int i = 0; i < length; i++)
	{
		printf("%d", a[i]);
	}
	return 0;
}

改进

如果在某一趟没有出现数据交换,就说明已经是排序好的,那么后面的循环就不需要再执行了。
设置一个flag变量,确定是否退出循环。

void BubbleSort(int a[]int length){
		int flag = 1;//flag=0就说明本轮没有进行交换,循环结束
		for(int i = 0; i < length - 1 && flag == 1; i++){//总共比较的轮次 i次
			flag = 0;
			for(int j = 0; j < length - 1 - i; j++){//每一轮比较的次数
				if(a[j] > a[j + 1]){
					flag = 1;//交换一次置位1
					int temp = a[j];
					a[j] = a[j + 1];
					a[j + 1] = temp;
				}
			}
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值