冒泡排序是相邻两个数不断比较在升序中将大的数不断移向后面。

首先要有数组的大小和需要排序的数组。

1:可以先将数组的最后一位设为end,while循环中不断对end自减,当end为零时表示数组中已经没有要排序的了。

2:内循环中不断将较大的数移向后面,循环中不断自增的i应该小于end;且安排i的前一项与i比较,这样就不会让数组溢出。

3:对于有序的情况可以设置一个flag,当发生交换时flag变为一,再每一轮循环结束是判断一下flag若flag没有发生变化,则表示数组已经有序。

 几大排序算法,还是比较基础的,一些数组的边界问题,要保证数组不能溢出,可以训练对边界问题的控制与把握

选择排序:选择排序是拟定一个最大值的下标,每次用这个最大值与数字所有的数比较,若小于这个数,就交换。

1:可以考虑一次选择两个数,最大的合最小的,先将每次循环选择的区间设为begin和end,初始begin=0,end=n-1;

2;拟定最大值下标为max=end,最小值下表为min=begin,再利用for循环分别找到最大和最小的下标。

3:将下标最大值与下表begin的值互换,最小值与min互换,再将begin++,end--使区间缩小,在小区间继续循环直到不满足begin<end为止,

4:因为需要交换两次。可能会出现begin下标的位置本来就是最大值,一次交换将min与begin交换,同时max也被放到了min的位置,所以需要修正max的位置。

代码:

 插入排序:

插入排序的基础是在一个有序数组中,通过不断比较将这个数放入到合适的位置使这个数组重新有序。

1:有序数组不容易得到,但是从第一个数开始不断从后面插入就可以不断得到有序数组,以此完成排序;

2:首先用for循环控制插入的数。将初始数组的长度设为一,因为n个数需要插入n-1次,也就是说最后一个数的下表为end=i。

3:用while循环来控制最后一个要插入的数的位置,若end>=0表示数组中还有数需要比较,若不满足此条件表示所有的数据已经比较完了也没有找到要放入的位置,则可能插入的数是最大或者最小,需要放在最前面。

希尔排序:也称为希尔插入排序,他是对排序的优化,因为插入排序需要一个一个的从后往前比较,效率可能比较慢,所以可以将数组中每隔一个特定距离的数视为一个数组,将这些数再次进行插入排序,,每次向前比较就会多移动一个gap,能更快的将数组变得比较有序。当gap为一时就是普通插入排序了,若一个数组已将变得比较有序,那么用插入排序就会很快的排好序。

1:再插入排序的基础上加一个gap,使每次选择数和移动数是移动gap个单位,很快的将这些数,然后将gap不断缩小,最后当gap为一时就排好序了。

 堆排序(升序):

1,堆排序的第一步是建立一个大堆,就是所有双亲结点都比其子结点的值大,那么堆顶就是这个数组中最大的数,然后不断拿走最大的数直到最后就将这个数组中的值排好序了,但是拿走堆顶的数会破坏堆,所以可以将堆顶的数与数组最后的数交换,后拿走堆尾的数,再将堆顶的数进行向下调整,就又是一个大堆了。

算法步骤:

1:首先是建堆,建堆使用的方法是通过不断向下调整实现堆的建立。

2:但是向下调整的条件是左右子树都要求是堆,那么可以从最后一个有子结点的树开始向下调整直到整个堆得顶部。

3:此时就有了一个大堆了,为了不破坏建好的堆,就得将堆顶的数据与堆尾的数据交换,然后前n-1项继续向下调整,直到整个堆中的数据全部拍。

由此可以看出排升序需要建大堆,排降序需要建小堆。

 

 归并排序:

有一种算法可以将两个有序数组合并为一个数组,且新数组也是有序的,归并排序也是这种思路,将整个需要排序的数组,分成多个小部分,知道不可分为之,然后对每个数据组做有序数组合并算法,当递归完成后新数组就是一个有序的数组了。

1:因为归并排序需要将排好的数据放在一个新数组中,所以得先开辟空间,开辟一个新数组,将要排序的数组,数组的首尾,和临时空间tmp一起传参给递归函数。

2:若递归函数的左区间下标大于右区间下标,则返回空,表示只剩下一个数或者没有数了。

3;定义一个整形mid表示此区间的中位数,以mid为分界线,将数组分为两段,分别递归进入其左段和其右段,

4:然后就是函数实现部分,第一段区间首位分别为begin1和end1,第二段为begin2和end2。

5:在while循环中若两区间都为有效区间,选择首元素较小的的数据放入tmp中,对此区间下表begin++,继续循环,直到有一个区间begin>end;

6:出循环后,将剩下的有效区间所有数据插入到tmp中,再将tmp中的所有数据插入arr的特定区段,依次向前返回,直到所有区段都排序完成。

 

 写排序算法重要的一点是,想清楚每一步的循环要完成什么样的任务,理清思路。然后就是边界的问题要细心。

快速排序以及常用的快排三种算法下次写

Copyright © 2024 玄灵镜
Powered by .NET 8.0 on Kubernetes