java 希尔排序算法(自己写)
希尔排序算法是对插入算法的应用吧,就是多次的使用了插入算法多排序的数组进行排序。
?
希尔排序是计算机科学家Shell发明的,是基于插入排序的,对插入排序进行改进的。依靠这个特别的实现机制,希尔排序对于多达几千个数据项,中等大小规模的数组排序表现良好。希尔排序不像快速排序和归并排序一样,时间复杂度是NlogN的排序算法快,因此对非常大的文件排序并不是最优的选择。但是希尔排序比选择排序和插入排序这种时间复杂度为N^2的算法速度要快的多了插入排序:复制的次数太多插入排序执行到一半的时候,标记符号左边这部分数据项是排序过的,这些数据项中间是有序的,而标记右边的数据项则没有排序过的。这个算法取出标记符号所指向的数据项,把它存储在一个临时变量里。接着,从刚刚被移除的数据项左边第一个单元开始,每次把有序的数据项右移动一个单元,直到存储在临时变量里的数据项能够有序回插插入算法中出现一个特例:假设一个很小得数据项是很靠近右端位子上,这里本来应该是值比较大的数据项多在的位子。把这个小数据项移动到左边的正确位子上,所有中间数据项 这个数据项原来所在的位子和它应该移动到位子之间的数据项都必须移动一位。这个步骤对每个数据项都执行了大概N次的复制虽然不是所有的数据项都要移动N个位子,但是平均移动了N/2次。插入算法的效率是N^2如果能以一种方式不必一个一个地移动所有中间的数据项,就能把较小的数据项移动到左边。那么这个算法的执行效率就会有很大的改进了n-增量排序 希尔排序通过加入插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项能大跨度地移动。 当这些数据项排过一趟后,希尔排序算法减小数据项的间隔再进行排序,依次进行下去。进行这些排序时数据项之间的间隔被 称为增量,并且习惯用小写的字母h表示。 这里的增量是排序数据项的间隔大小,然后对这个间隔的数据项归为一组 对其在数组中进行排序 交换位子 经过这个增量的加入,然后排序过以后,新数列有新的特点了,那就是小的数据是在左边,大的数据是在有边,不大不小的数据是在中间了 但是没有完全的进行好了排序 。这也是希尔排序的奥秘所在。插入排序对基本有序的数组是非常有效的,如果插入排序值需要把数据项移动一位或者两位,那么算法大概需要N时间复杂度。当数组完成增量为4的排序之后,可以进行普通的插入排序。减小间隔对于更大的数组,开始的间隔应该大写,然后间隔不断变小,直到间隔为0举例来说把,对于 含有1000个数据项的数组,可能先以264为增量,然后用121为增量,然后用40为增量,然后用13然后用4最后用1为增量进行希尔排序。用来间隔的数组成的列称为 间隔数列。 h = 3*h + 1 (h从1开始)可以这样来取排序算法中,首先在一个短小的循环中使用序列的生成公式来计算出最初的间隔。h值最初赋值为1,然后用公式生成4 13 40等等,当间隔大于数组大小的时候停止h的迭代。对于含有1000个数据项的,1093就是太大了,那样用364就够了。然后倒即?
?
?