高级排序
希尔排序:
基于插入排序,在插入排序的开始部分,在合适的位置把h赋值为1,并且添加生成间隔序列的公式,、通过交错的内部有序的数据项集合,减小了工作量。
因为h很大时,每一趟排序要移动元素个数很少,移动距离很长;虽然h会逐渐减小,每趟排序要移动的元素个数变多,但此时已基本有序,所以总的来说比插入排序更有效率。
时间复杂度:大约为O(N*(logN)2),从O(N3/2)到O(N7/6)
快于:选择排序、插入排序:O(N2)
慢于:快速排序:O(N*logN)
间隔序列:
h=3*h+1,当间隔大于数组大小的时候停止。
数字要互质,这样可以使每一趟排序更有可能保持前一趟排序已排好的效果。
划分:
partitionIt()
把数据分为两组,关键字大于特定值的数据项在一组,关键字小于特定值的数据在另一组。注意不是对半分,可以左右个数不同。
两个指针在工作,分别指向数组两头,注意在工作之前要分别的加一和减一。
时间复杂度:O(N)
每一次划分都有N+1或N+2次的比较,比较次数不取决于数据是如何排列的,交换次数取决于数据是如何排列的。
快速排序:
quickSort()
recQuickSort()
把一个数组划分为两个子数组,然后递归调用自身为每一个子数组进行快速排序,递归的终止条件为数组只包含一个数据项,此时就定义数组已有序方法立即返回。
选择枢纽:
可任意选择一个数据项的关键字的值作为枢纽,枢纽开始时在右端,划分完成后被插入到左右数组间的分界处。
时间复杂度:O(N*logN)
以O(N2)运行时,慢,调用次数太多,递归可能会发生溢出,从而使系统瘫痪。
解决方法:“三数据项取中”划分,以数组里第一个、最后一个以及中间位置数据项的居中数据项值设为枢纽来划分。独立的方法medianOf3()对左端、中间以及右端数据项进行排序。此方法返回枢纽,并且传递给partitionIt()方法。
基数排序:
把关键字拆分成数字位,按数字位的值对数据项进行排序。使用链表,外层循环依次查看关键字的每一位;有两个内部循环:第一个循环把数据项放到链表中,第二个循环再把数据项复制回数组。
时间复杂度:
O(N),绝大多数情况下算法效率倒退为O(N*log2N),和快速算法相同。其所需要的存储空间是快速排序的两倍。
复制的次数和数据项的个数与关键字的位数的乘积成正比,位数是关键字值的对数。

浙公网安备 33010602011771号