冒泡排序
首先,我们先来看最简单的一种排序方法——冒泡排序:
冒泡排序,其实就是相邻比较,然后当满足某种要求(前一个大于后一个,或者后一个大于前一个),就进行交换。这样一来,当每次遍历数组后,就会把最大(小)的一个数,移到结尾。
这是一个非常重要的特性,也是因为这个特性,我们才可以得知外层循环应该执行几次(即应该遍历这个数组多少次)。假设数组中有N个元素,因为一次次遍历之后,最后一个无需继续比较了,所以外层循环只需要执行N-1次。相同的,对于内层循环来说,最后一个没有相邻的与之比较,所以也只需要N-1次。
我们来看看实现这种排序的代码:
#include<stdio.h>
int main(){
int a[10]={3,5,1,14,88,5,3,8,17,9};
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(a[j]>=a[j+1]){
int t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(int i=0;i<9;i++)
printf("%d\n",a[i]);
}
选择排序
选择排序:它的核心是,每一次进行线性搜索,找到最小值。所以同刚才一样,它的外层循环也是N-1次,内层要从第i个元素开始,一直到最后。
让我们用代码实现它:
#include<stdio.h>
int main(){
int a[10]={3,7,4,1,5,11,6,4,2,0};
for(int i=0;i<9;i++){
for(int j=i+1;j<9;j++){
if(a[i]>a[j]){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for(int i=0;i<9;i++){
printf("%d\n",a[i]);
}
}
插入排序
插入排序,默认最左端的数字已经排序完成,然后取出未排序的数字,将其与左侧已排序的数字进行比较,直到左边部分数字最小的到达最左端,重复直到完成。这样每次都会得出左边的有序数组,第0次一个,第一次是两个数的有序数组…所以第一层循环也只用N-1次。
#include<stdio.h>
int main(){
int num[10] = {3,0,1,8,7,2,5,4,9,6};
for(int i = 0; i < 10-1; i++){
if(num[i] > num[i+1]){
int temp = num[i];
num[i] = num[i+1];
num[i+1] = temp;
}
for (int j = i;j > 0; j--){
if(num[j] > num[j-1]){
break;
} else{
int temp = num[j];
num[j] = num[j-1];
num[j-1] = temp;
}
}
}
}
for(int i = 0; i < 10; i++){
printf("%d ", num[i]);
}
return 0;
}