1.冒泡排序
懒得画图了,借用一下其他人的图;冒泡排序就是两两数据相互比较。
#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.插入排序
看图,这是插入排序的逻辑,分为两段数据,红线前面的是有序数据,红线后面的是无序数据,我们需要将无序的数据插入到有序当中,成为新的一段有序数据。老规矩还是写一个循环定个位置
#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;
}
没看错吧,还是上一段代码,只不过我改了一下逻辑而已,太懒了我。第一层循环固定个位置,假设第一个数据已经是有序的了,就一个数肯定是有序啦。然后以这个位置的下一个数据和前面进行比较,然后插入,第一次比较一次,随着不断插入比较次数随着循环增加,这就是插入排序。在已知的有数组中插入新数据,组成新的有序数组。
以后在更新新的排序算法吧,突发奇想,一段代码拿来用还几次也没谁了。