本文包含以下七种排序算法。
一、插入排序
1.插入排序(Insert Sort)的基本原理,每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象适当位置上,直到对象全部插入为止。
2.算法步骤
①设待排序的记录存放在数组r[1····n]中,r[1]是个有序序列。
②循环n-1次,每次使用顺序查找法,查找r[i](i=2,···n)在已排好序的序列r[1···i-1]中的插入位 置,然后将r[i]插入表长为i-1的有序序列r[1···i-1],直到将r[n]插入表长为n-1的有序序列。说白了就是取出下一个元素,就把它放到前面排列好的序列中进行比较,进而确定位置 。
示例图:n=6,数组R的六个排序码分别为:17,3,25,14,20,9。
二、希尔shell排序
1.基本思想:设待排序的数据对象有n个,首先取一个整数d < n作为间隔,将全部对象分为d个子序列,所有距离为d的对象放在同一个序列中,在每一个子序列中分别施行直接插入排序,然后缩 小间隔d,如取d=d/2。重复上述的子序列划分和排序工作,直到最后取d为1为止。
2.说白了就是将序列拆分成几个序列,然后各自进行排序,然后再拆分得细一点再排序,直到1.
三、冒泡排序
1.基本思想:通过两两比较相邻的关键字,如果发生逆序,则进行交换,从而使关键字小的记录 如气泡一般向上漂浮,或者使关键字大的记录像石头一样逐渐向下坠落。
2.说白了就是每趟排序都以整个序列为单位,比较相邻的元素进行排序。
四、快速排序
1.基本思想:取待排序的结点序列中某个结点的值作为控制值(一般是第一个),采用某种方法把这个结点放到适当的位置,使得这个位置的左边的所有结点的值都小于等于这个控制值,而这个位置的右边的所有结点的值都大于等于这个控制值。然后分别对这两个子序列重复实施上述方法。
2.说白了就是以第一个数组元素作为关键数据,赋给key,即key=A[0],从 j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换。 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和 A[j]互换。
3.示例图:
五、选择排序
1.基本思想:在每一趟带排序的记录中选出关键字最小的记录,按照顺序排放在已经排好序的记 录序列的最后,直到序列全部有序。
2.比如求正向排序,第一次就是从序列中找最小的,然后交换位置,第二趟就找次小的,然后交换
3.
六、堆排序
1.基本思想:堆是完全二叉树。
①堆所对应的完全二叉树的根结点是元素序列中的值最小或最大元素。
②从根结点到每一个叶子结点的路径上的元素组成的序列都是按元素值递增或递减。
③堆可以采用一维数组来存储。
2.筛选法调整堆方法:
从r[2s]和r[2s+1]中选出关键字较大者,假设r[2s]的关键字较大,比较r[s]和r[2s]的关键字
①若r[s].key>=r[2s].key,说明以r[s]和r[2s]为根的子树已经是堆,不必做调整。
②若r[s].key<r[2s].key。交换后,以r[2s+1]为根的子树仍是堆,如果r[2s]为根的子树 不是堆,则重复上述过程,将以r[2s]为根的子树调整为堆,直至进行到叶子结点为止。
3.说白了就是从最下面的非叶节点开始比较大小进行排序
七、归并排序(2-路归并排序)
1.基本思想:假设初始的对象序列有n个数据对象,我们首先把它看成是n个长度为1的有序子序列,先做两两归并,得到n/2个长度为2的归并项(如果n为奇数,则最后一个有序子序列的长 度为1);再做两两归并,……,如此重复,最后得到一个长度为n的有序序列。
2. ①将当前序列一分为二,求出分裂点mid=⌊(low+high)/2⌋;
②对子序列R[low,mid]递归,进行归并排序,结果放入S[low,mid]中;
③对子序列R[mid+1,high]递归,进行归并排序,结果放入S[mid+1,high]中;
④将有序的两个子序列S[low,mid]和Smid+1,high]归并为一个有序序列T[low,high].
3.刚开始以单个元素为单位,两两比较排序,然后是两个元素为单位继续排序...