算法七之希尔排序
一、希爾排序
(1)簡(jiǎn)介
希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進(jìn)版本。希爾排序是非穩(wěn)定排序算法。該方法因DL.Shell于1959年提出而得名。 希爾排序是把記錄按下標(biāo)的一定增量分組,對(duì)每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關(guān)鍵詞越來(lái)越多,當(dāng)增量減至1時(shí),整個(gè)文件恰被分成一組,算法便終止。 (2)基本思想 先取一個(gè)小于n的整數(shù)d1作為第一個(gè)增量,把文件的全部記錄分組。所有距離為d1的倍數(shù)的記錄放在同一個(gè)組中。先在各組內(nèi)進(jìn)行直接插入排序;然后,取第二個(gè)增量d2<d1重復(fù)上述的分組和排序,直至所取的增量??=1(1<…<d2<d1),即所有記錄放在同一組中進(jìn)行直接插入排序?yàn)橹埂?該方法實(shí)質(zhì)上是一種分組插入方法比較相隔較遠(yuǎn)距離(稱為增量)的數(shù),使得數(shù)移動(dòng)時(shí)能跨過(guò)多個(gè)元素,則進(jìn)行一次比較就可能消除多個(gè)元素交換。算法先將要排序的一組數(shù)按某個(gè)增量d分成若干組,每組中記錄的下標(biāo)相差d.對(duì)每組中全部元素進(jìn)行排序,然后再用一個(gè)較小的增量對(duì)它進(jìn)行,在每組中再進(jìn)行排序。當(dāng)增量減到1時(shí),整個(gè)要排序的數(shù)被分成一組,排序完成。 一般的初次取序列n的一半為增量,以后每次減半(盡量不要是前一個(gè)增量的倍數(shù),否則效率低下),直到增量為1。二、算法實(shí)現(xiàn)
package cn.mk;import java.util.Arrays;/**** @author MK*/ public class ShellSort {/*** 每次增量進(jìn)行的插入排序* @param data 序列* @param dk 增量*/private static void shellInsert(int[] data,int dk){int j;int temp;//臨時(shí)空間//遍歷dk組序列for (int i = dk; i < data.length; i++) {//與前dk個(gè)元素的比較if(data[i-dk]>data[i]){temp=data[i]; //臨時(shí)保存//直到比當(dāng)前i所在元素小才停止for (j = i-dk; j >=0&&data[j]>temp; j-=dk) {data[j+dk]=data[j];}data[j+dk]=temp; //回填數(shù)據(jù)}}}/*** 希爾排序* @param data 序列*/public static void shellSort(int[] data) {//增量int dk=data.length/2;//增量最終減到為1while (dk>=1) { shellInsert(data, dk);dk/=2;}}public static void main(String[] args) {int[] data={2,3,1,3};shellSort(data);System.out.println(Arrays.toString(data));} }?
三、算法復(fù)雜度
最好時(shí)間O(n);最壞時(shí)間O(ns),(1<s<2);平均時(shí)間O(nlogn);不穩(wěn)定;Hibbard增量dk=2t-k+1-1,(1<=k<=t<?log2(n+1)?),希爾排序的時(shí)間復(fù)雜度為O(??),希爾排序時(shí)間復(fù)雜度的下界是nlog2n,沒(méi)有快速排序算法快 O(nlogn),因此中等大小規(guī)模表現(xiàn)良好,對(duì)規(guī)模非常大的數(shù)據(jù)排序不是最優(yōu)選擇。
總結(jié)
- 上一篇: “鸿星尔克”告“鸿红星尔克”侵权 后被被
- 下一篇: 算法八之归并排序