排序算法实现(基于408)
文章目录简单易实现的三大排序插入排序选择排序冒泡排序简单易实现的三大排序这里为了方便大家写好后检验我们可以直接以洛谷这个题来检查代码。并且这里给的只有三个数据我们使用这三个排序也不会太麻烦。插入排序对于插入排序我个人的理解是将数组分成两部分已排序和未排序。我们每轮的任务就是从未排序序列中选择一个数并为其在已排序序列中找到一个合适的位置供其插入。什么时候算是找到插入位置呢如果是升序排序就是当我们第一次在已排序序列中找到一个数小于等于等于是为了排序的稳定性当前选择的数的时候我们就可以把这个数插到他后面去。那如果已排序序列中的数大于当前这个数呢我们就需要像打牌一样把已排序序列中的数往后移便于空出位置插入。因此循环内的逻辑就是大于元素后移小于等于找到位置插入。 那我们应该怎么控制循环呢初始状态下我们可以从第二个元素开始这样前面只有一个元素当然可以认为是排好序的。接下来我们只需要记录下当前未排序序列中选定的这个数因为后续可能会因为元素移动而被覆盖往前开始找插入位置即可。于是代码如下#includebits/stdc.husingnamespacestd;intmain(){inta[3];cina[0]a[1]a[2];for(inti1;i3;i){intcura[i];intj;for(ji-1;j0;j--){if(a[j]cur){a[j1]a[j];}else{break;}}a[j1]cur;}couta[0] a[1] a[2];}选择排序选择排序的思想我觉得就更简单了每轮从数组中选一个最小的元素把它交换到第一位即可。因此在循环内我们只需要比较即可最后用cpp自带的swap函数把他和当前轮中的第一位元素交换即可。代码如下#includebits/stdc.husingnamespacestd;intmain(){inta[3];cina[0]a[1]a[2];for(inti0;i3;i){intmin_indexi;for(intji1;j3;j){if(a[j]a[min_index]){min_indexj;}}swap(a[i],a[min_index]);}couta[0] a[1] a[2];}冒泡排序个人感觉冒泡排序和插入排序其实很像如果是升序排序的话我们每轮会将一个最大的元素冒到后面去因此数组末尾已排好序的序列会逐渐变长。并且由于冒泡排序每轮都会交换因此当数组没有发生交换时就可以判断当前已排好序可以停止因此我们可以设置一个bool变量每当调用过swap函数就将其值改为true每轮开始前又改回false这样当出现一轮没有变化时就可以提前退出循环。在循环外我们可以设置一个end变量用来记录当前已排好序的位置初始状态下end 最后一个元素所在位置只有一个元素可以认为是有序的于是代码如下#includebits/stdc.husingnamespacestd;intmain(){inta[3];cina[0]a[1]a[2];intend2;boolflagtrue;while(flag){flagfalse;for(inti0;iend;i){if(a[i]a[i1]){swap(a[i],a[i1]);flagtrue;}}end--;}couta[0] a[1] a[2];}最近再看408的os剩下的几个排序后面做到题在更吧。希望大家看完能练一下熟练掌握这几个简单排序算法的实现哪里写的不好的也请大家指出谢谢