冒泡排序
都知道冒泡排序是最简单的排序,其原理就是相邻的两个数比较,如果前面的数字比后面的数字要大的话,两者就交换位置。
如果我说的不是很明白,那就看一下动态图。
下面是代码:
/************************冒泡排序**************************/
/***********相邻的比大小,如果不符合规律则交换*************/
/******这里的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;
}
注明出处,动图来自菜鸟教程,内容为作者原创。