前言:排序是現(xiàn)在程序員的必備技能搔弄,是很多公司的面試必考點幅虑,不管是做移動端,后端開發(fā)顾犹,排序是繞不過的倒庵,眾生平等。學(xué)習(xí)其排序的思想往往能解決不同類型的問題炫刷,所以靜下心來擎宝,研究一下不同的排序算法,算是對自己有一個提升浑玛。
排序概述:排序就是將一組對象按照某種邏輯順序重新排列的過程绍申。
十大排序算法:冒泡排序,選擇排序顾彰,插入排序极阅,歸并排序,堆排序涨享,快速排序筋搏,希爾排序,計數(shù)排序厕隧,基數(shù)排序奔脐,桶排序。
本文對希爾排序走一個解析:
希爾排序步驟:
1.一種基于插入排序的快速排序算法吁讨。簡單插入排序?qū)τ诖笠?guī)模亂序數(shù)組很慢帖族,因為元素只能一點一點得從數(shù)組一端移動到另一端。例如挡爵,如果主鍵最小的元素正好在數(shù)組的盡頭竖般,要將它挪到正確的位置就需要N-1次移動。
2.希爾排序為了加快速度簡單地改進(jìn)了插入排序茶鹃,也稱為縮小增量排序涣雕,同時該算法突破0(n^2)的第一批算法之一艰亮。
3.希爾排序是把待排序數(shù)組按一定數(shù)量的分組,對每組使用直接插入排序算法排序挣郭;然后縮小數(shù)量繼續(xù)分組排序迄埃,隨著數(shù)量逐漸減少,每組包含的元素越來越多兑障,當(dāng)數(shù)量減至1時侄非,整個數(shù)組恰被分成一組,排序就完成了流译。這個不斷縮小的數(shù)量逞怨,就構(gòu)成了一個增量序列。
代碼舉例:
對一個數(shù)組進(jìn)行排序:(86,11,77,23,32,45,58,63,93,4,37,22)
int[] array = {86,11,77,23,32,45,58,63,93,4,37,22};
排序代碼展示:?
調(diào)用sort方法后打印如下:
對該案例進(jìn)行分析:(86,11,77,23,32,45,58,63,93,4,37,22)
(1) ?當(dāng)gap = 6福澡,因為該數(shù)組長度為12叠赦,那么就從58開始 到22這一組, 根據(jù)排序代碼所知:currentValue = 58(待排序元素)preIndex = 0 ? currentValue < 第0個位置也就是86革砸。?滿足while條件進(jìn)入:58這個位置變成了86 ?第0個位置就變成了58.直至for循環(huán)結(jié)束除秀,完成了第一組排序。
? ? ? ? ?數(shù)組變成 ------》 [58, 11, 77, 4, 32, 22, 86, 63, 93, 23, 37, 45]?
(2)當(dāng)gap = 3,因為該數(shù)組長度為12. ?那么就從4開始 到45這一組依然按照第(1)順序進(jìn)行操作算利。
? ? ? ? ?數(shù)組變成 ------》 [4, 11, 22, 23, 32, 45, 58, 37, 77, 86, 63, 93]
(3)當(dāng)gap = 1,因為該數(shù)組長度為12. ?那么就從11開始 到93這一組依然按照第(1)順序進(jìn)行操作册踩。
? ? ? ? ?數(shù)組變成 ------》?[4, 11, 22, 23, 32, 37, 45, 58, 63, 77, 86, 93]
至此排序結(jié)束
?打印每個步驟的數(shù)組:
?至此希爾排序就到這里講解結(jié)束了,細(xì)看的話其實一點也不復(fù)雜效拭。