一、选择排序
1)图解
将上面的的这个图用选择排序,那么将是如下的方式来进行排序,看下图
上图用第一个元素依次和后面所有数进行比较,交换后的结果为
以此类推,用第二个数、第三个数、第四个数与后面的数进行比较
好了,到这里想必大家都明白了大概是怎么实现的了,现在我们就进入代码区来进行实现
2)代码(C语言)
#include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]){ int arr[] = {1,5,3,2,4}; int temp; int len = sizeof(arr)/sizeof(int); for (int i = 0; i < len; i++) { for (int j = i + 1; j < len; j++) { if(arr[i]<arr[j]){ temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } for (int i = 0; i < len; i++) { printf("%d",arr[i]); //输出结果就是5 4 3 2 1 } }
这里我就不做过多解释了,代码实现相对比较的简单
二、冒泡排序
1)图解
还是拿上面的那个图来讲解
第一轮我们先画出来,选择最小的元素排在最后,以此两个数进行比较
第二轮后面的依次类推,方式是一样的。
第二轮结果 第三轮结果因为数字的特殊性,现在已经排好序,但是后面那一轮比较还是会进行的。
上面就是我们第一轮要进行排序的结果,总的次数是(n-1),我么把次数当成m,那么每轮的次数就是(n - m),意思就是我们排一个数后,每次轮训的次数就要减少,比如说上面它的次数就是4(第一轮)->3(第二轮)->2(第三轮)->1(第四轮)
2)代码
#include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]){ int arr[] = {1,5,3,2,4}; int temp; int len = sizeof(arr)/sizeof(int); for (int i = 0; i < len; i++) { for (int j = 0; j < len - i; j++) //代码主要是这里的不同 { if(arr[j]<arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } for (int i = 0; i < len; i++) { printf("%d",arr[i]); //输出结果就是5 4 3 2 1 } }
代码还是相对的比较简单,也不做过的解释了哈,图解已经把这个原理说的比较的清楚了。
三、插入排序
1)图解
上原图
它的原理:就是拿一个数出来和前面的进行比较,如果刚好是小于前面的这个数,那么就插入到这个数的前面去
为方便理解,我们就从小到大进行排序,接下来看图
好了以上就是我们的插入排序,是不是也并不复杂,那么接下来就是写代码的时候
2)代码
#include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]){ int arr[] = {1,5,3,2,4}; int temp; int len = sizeof(arr)/sizeof(int); for (int i = 0; i < len; i++) { temp = arr[i]; int j; for (j = i; j > 0; j--) { if(temp < arr[j-1]){ //比较这个数小于前面的数就将前面这个数后移一位 否则就结束循环 arr[j] = arr[j-1]; } else break; } arr[j] = temp; } for (int i = 0; i < len; i++) { printf("%d",arr[i]); //输出结果就是5 4 3 2 1 } }
四、小总结
我们不难看出这些排序都是我们基本需要掌握的知识,那么至于性能的话可能不是特别的好,如果需要性能更加的优化,就需要学习其它的算法。这里排版可能不是太好,还请见谅。