简易的排序

冒泡排序

        都知道冒泡排序是最简单的排序,其原理就是相邻的两个数比较,如果前面的数字比后面的数字要大的话,两者就交换位置。

如果我说的不是很明白,那就看一下动态图。

冒泡排序

下面是代码:

/************************冒泡排序**************************/
/***********相邻的比大小,如果不符合规律则交换*************/
/******这里的i是控制比较次数,冒泡的话是先排出最大的数*****/ 

#include <iostream>
#define N 10
using namespace std;
int main()
{
	int i, j, t;
	int a[N] = {10, 8, 5, 6, 2, 3, 1, 7, 9, 4};
	for (i = 0; i < N - 1; i++) {
		for (j = 0; j < N - 1 - i; j++) {
			if (a[j] > a[j + 1]) {
				t = a[j];
				a[j] = a[j + 1];
				a[j + 1] = t;
			}
		}
	}
	for (i = 0; i < N; i++)
		printf("%d ", a[i]);
	return 0;	
} 

 实质上,冒泡排序是先将最大的数字排好。

选择排序

选择排序的话,就是往后面找比当前小而且最小的数,如果找到了就交换,看起来就好像是避免了像冒泡排序的挨个交换。

不理解的看一下动图

选择排序
​​​​​

下面是代码:

/***********************选择排序*************************/
/**************选择排序是默认先排出最小的数字************/
/****************这里的i是比较的对象********************/
#include <iostream>
#define N 10
using namespace std;
int main()
{ 
	int a[N] = {10, 8, 5, 6, 2, 3, 1, 7, 9, 4};
	int i, j, t;
	for (i = 0; i < N; i++) {
		int flag = i;
		for (j = i + 1; j < N; j++) {
			if (a[flag] > a[j]) {
				flag = j;
			}
		}
		if (flag != i) {
			t = a[flag];
			a[flag] = a[i];
			a[i] = t;
		}
	}
	for (i = 0; i < N; i++)
		printf("%d ", a[i]);
	return 0;
} 

 插入排序

插入排序有点像打扑克一样,就是默认先前抓到手的牌是有序的,如果找到一个数,就往前面插,其他牌往后挪。

原理看一下动图:

插入排序

下面是代码:


/******************插入排序**************************/
/*****原理是默认前面的数是有序的,然后挨个插入*****/ 
/*****两层循环里面的i是比较的对象*****/ 

#include <iostream>
#define N 10
using namespace std;
int main()
{
	int a[N] = {10, 8, 5, 6, 2, 3, 1, 7, 9, 4};
	int i, j, t;
	//默认i前面的数字已经排好了 
	for (i = 1; i < N; i++) {
		int key = a[i];
		j = i - 1;
		while (j >= 0 && key < a[j]) {
			a[j + 1] = a[j];
			j--;
		}
		a[j + 1] = key; 
	}
	for (i = 0; i < N; i++)
		printf("%d ", a[i]);
	return 0;
} 

 注明出处,动图来自菜鸟教程,内容为作者原创。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值