排序算法之冒泡排序(一)

        

首先问大家一个问题如果我让大家比较两个数[1,5],然后把其中大的一个数字选择出来。我相信大家会好不犹豫的写出以下这个代码:

int a1 = 1, a2 = 5, max = -1;
if(a1 < a2)
    max = a2;
else 
    max = a1;


或者是: max = a1 > a2 ? a1 : a2;

那么如果我问大家如何从三个数字里面选出最大的数字呢?

        我相信大家会毫不客气的跟我说这还不简单,先前两个比较,选出较大的一个和第三个比较,然后选出较大的那个便是最大的那个。(我相信对大家来说这都是很简单的)

int a1 = 3, a2 = 5, a3 = 2, max = -1;

int Max(int a, int b){
    return a  > b ? a : b;
}

max = Max(a1, Max(a2, a3));    //先求出a2, a3中较大的那个, 然后和a1比较选出最大。

        这个我要是问大家如何从n个数字里面选出较大的数字呢?大家可能就会犹豫一下,但是相信大部分人会这么告诉我,我先比较第一个,第二个, 然后把大的那个和第三个比较以此类推。

                                ​​​​​​​        ​​​​​​​        ​​​​​​​        max_{n} = Max(an, max_{n-1})       

a1, a2, a3 ..... an

for(int i = 0; i < n; ++i){
    max = Max(max, an);
}

 

        然后大家问我,这和排序有什么关系?这不是讲的排序吗?是的今天我要说的是排序算法!!接下来大家想一个问题, 能不能用上边提到的选出n个数字最大值的方法进行排序?

a1, a2, a3, a4..... an-2, an-1, an。我们可以先把最大的数字放在最后(假设a3最大), a1, a2,(an), a4... an-2, an-1, (a3).。此时我们便把最后一个数字变为了最大。接下来我们能不能把倒数第二个位置的数放第二个大的数字呢?当然可以,采用前面的方法,对剩余的n-1个数字选出最大的数字,放在最后就可以了。那倒数第三个位置呢?同理...一直重复下知道最后一个数字。IN

Init15632
115236
213256
312356

大家可以先看看这种排序的方法。简单易懂。

每次都把最大的数字放在最后一位即可。

#include <stdio.h>

void swap(int a[], int a1, int a2){
	int temp = a[a1];
	a[a1] = a[a2];
	a[a2] = temp;
}

int main(){
	int a[12] = {1,4,3,5,7,9,2,3,11,0,16,2};
	for(int i = 1; i<=12; ++i){
		int index = 0, max_number = a[0];
		for(int j = 0; j < 12-i+1; ++j){
			if(max_number < a[j]){
				index = j;
				max_number = a[j];
			}
		}
		swap(a, 12-i, index);
		printf("第%d遍历: ", i);
		for(int k = 0; k < 12; ++k){
			printf("%d ", a[k]);
		}
		printf("\n");
	}
	return 0;
} 

 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值