冒泡排序和插入排序详解

1.冒泡排序

6749e4dd856341598497c40c5e7362b0.pngc242ca17b0a841a9b3a49c1ffaadffd0.pngb86d35c1a2104a2abbf4b2c8f46b7625.png7e187b83f5524da48bb2d3248d704f4f.png

懒得画图了,借用一下其他人的图;冒泡排序就是两两数据相互比较。

#include <stdio.h>
#define N 10
int main()
{
	int i, j, t;
	int a[N] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
	
	// 冒泡排序(升序)
	for(i = 0; i < N; i++) // 10个数要交换9轮
		for(j = 0; j < N - i; j++) // 第一轮比较9次,第二轮比较8次...第9轮比较一次
			if(a[j] > a[j+1]) // 如果前面的数比后面的数大,则交换
			{
				t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
			}
			
	// 打印排序后的数组			
	for(i = 0; i < 10; i++)
		printf("%d ", a[i]);
	printf("\n");
	return 0;
}

上面这段代码就是冒泡排序,相邻的两两进行交换。其实冒泡排序也不一定是要相邻的两个数据进行交换,只要能够做到两两交换就行。下面是我修改的一段代码,看看是不是和你理解的冒泡排序的同一种。

#include <stdio.h>
#define N 10
int main()
{
	int i, j, t;
	int a[N] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
	
	// 冒泡排序(升序)
	for(i = 0; i < N; i++) // 10个数要交换9轮
		for(j = i+1; j < N; j++) // 第一轮比较9次,第二轮比较8次...第9轮比较一次
			if(a[i] > a[j]) // 如果前面的数比后面的数大,则交换
			{
				t = a[j];
				a[j] = a[i];
				a[i] = t;
			}
			
	// 打印排序后的数组			
	for(i = 0; i < 10; i++)
		printf("%d ", a[i]);
	printf("\n");
	return 0;
}

假设我有个数组{5,6,3};

第一次遍历  

第一次排序 5 6 3 

第一次排序 3 6 5 

第二次遍历  

第一次排序 3 5 6

第一层循环先固定一个位置,然后以这个位置的数和它后面的数进行一 一比较。这段代码没有违背两两交换原则。

2.插入排序

f3175dc4ec614c74b475605d88966dd1.png

 看图,这是插入排序的逻辑,分为两段数据,红线前面的是有序数据,红线后面的是无序数据,我们需要将无序的数据插入到有序当中,成为新的一段有序数据。老规矩还是写一个循环定个位置

#include <stdio.h>
#define N 10
int main()
{
	int i, j, t;
	int a[N] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
	
	// 插入排序(升序)
	for(i = 0; i < N-1; i++) // 10个数要交换9轮
		for(j = i+1; j >0; j--) // 第一轮比较9次,第二轮比较8次...第9轮比较一次
			if(a[j-1] > a[j]) // 如果前面的数比后面的数大,则交换
			{
				t = a[j];
				a[j] = a[j-1];
				a[j-1] = t;
			}
			
	// 打印排序后的数组			
	for(i = 0; i < 10; i++)
		printf("%d ", a[i]);
	printf("\n");
	return 0;
}

没看错吧,还是上一段代码,只不过我改了一下逻辑而已,太懒了我。第一层循环固定个位置,假设第一个数据已经是有序的了,就一个数肯定是有序啦。然后以这个位置的下一个数据和前面进行比较,然后插入,第一次比较一次,随着不断插入比较次数随着循环增加,这就是插入排序。在已知的有数组中插入新数据,组成新的有序数组。

以后在更新新的排序算法吧,突发奇想,一段代码拿来用还几次也没谁了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值