排序的概念
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次
序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排
序算法是稳定的;否则称为不稳定的。两个数相等时,第一个数排序前在另外一个数之前,拍完序之后还在另外一个数之前。
内部排序:数据元素全部放在内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
常见的几大类排序
基数排序,数据约束比较明显,这七种排序比较通用
插入类排序
直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一
个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列
每次遍历到一个数,找到前面小于等于它时候的位置
因为前面已经排好的全部时有序数列,最大的数已经时有序数列中最后的那个数如果正好和前一个数相等或者大于前一个数,则直接end+1回到待排序数的下标,等于keyi跳到下一个数继续判断如果小于的话,往后移动,则从end下标开始,遍历整个有序数列,找到key>某个数的时候,直接让end+1=key,原来的end+1位置的数已经移动到end+2位置所以直接让直接让end+1=key,完成插入,如果end=-1表示,有序数列中最小的数都比key小,则end+1下标回到0,数组第一个元素的位置就是key
希尔排序为了解决直接插入排序的一些缺点,希尔排序,通过分组的方法,让数据在每次进行直接插入排序的时候都是接近有序的。对直接插入排序进行更改。
以前直接插入时,end+1,其实就是希尔排序中分组间隔为一时候的情况
现在,有分组间隔,所以每回在组内搬运元素,每回end+分组间隔gap就行每个小组排完序后数组接近有序,分组间隔减一,再排序,最后一次插入排序,整个数组接近有序
最后一次插入排序,整个数组接近有序,直接插入最快