今天来谈谈三大基础排序选择排序冒泡排序插入排序
Posted dy105525
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了今天来谈谈三大基础排序选择排序冒泡排序插入排序相关的知识,希望对你有一定的参考价值。
一、选择排序
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 } }
四、小总结
我们不难看出这些排序都是我们基本需要掌握的知识,那么至于性能的话可能不是特别的好,如果需要性能更加的优化,就需要学习其它的算法。这里排版可能不是太好,还请见谅。
以上是关于今天来谈谈三大基础排序选择排序冒泡排序插入排序的主要内容,如果未能解决你的问题,请参考以下文章