高级排序

希尔排序:

基于插入排序,在插入排序的开始部分,在合适的位置把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),和快速算法相同。其所需要的存储空间是快速排序的两倍。

复制的次数和数据项的个数与关键字的位数的乘积成正比,位数是关键字值的对数。

 

posted @ 2021-03-09 21:38  Xiarsu  阅读(24)  评论(0)    收藏  举报