前言:排序是現(xiàn)在程序員的必備技能,是很多公司的面試必考點,不管是做移動端,后端開發(fā),排序是繞不過的,眾生平等。學(xué)習(xí)其排序的思想往往能解決不同類型的問題,所以靜下心來,研究一下不同的排序算法,算是對自己有一個提升。
排序概述:排序就是將一組對象按照某種邏輯順序重新排列的過程。
十大排序算法:冒泡排序,選擇排序,插入排序,歸并排序,堆排序,快速排序,希爾排序,計數(shù)排序,基數(shù)排序,桶排序。
本文對希爾排序走一個解析:
希爾排序步驟:
1.一種基于插入排序的快速排序算法。簡單插入排序?qū)τ诖笠?guī)模亂序數(shù)組很慢,因為元素只能一點一點得從數(shù)組一端移動到另一端。例如,如果主鍵最小的元素正好在數(shù)組的盡頭,要將它挪到正確的位置就需要N-1次移動。
2.希爾排序為了加快速度簡單地改進了插入排序,也稱為縮小增量排序,同時該算法突破0(n^2)的第一批算法之一。
3.希爾排序是把待排序數(shù)組按一定數(shù)量的分組,對每組使用直接插入排序算法排序;然后縮小數(shù)量繼續(xù)分組排序,隨著數(shù)量逐漸減少,每組包含的元素越來越多,當數(shù)量減至1時,整個數(shù)組恰被分成一組,排序就完成了。這個不斷縮小的數(shù)量,就構(gòu)成了一個增量序列。
代碼舉例:
對一個數(shù)組進行排序:(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方法后打印如下:

對該案例進行分析:(86,11,77,23,32,45,58,63,93,4,37,22)
(1) ?當gap = 6,因為該數(shù)組長度為12,那么就從58開始 到22這一組, 根據(jù)排序代碼所知:currentValue = 58(待排序元素)preIndex = 0 ? currentValue < 第0個位置也就是86。?滿足while條件進入:58這個位置變成了86 ?第0個位置就變成了58.直至for循環(huán)結(jié)束,完成了第一組排序。
? ? ? ? ?數(shù)組變成 ------》 [58, 11, 77, 4, 32, 22, 86, 63, 93, 23, 37, 45]?
(2)當gap = 3,因為該數(shù)組長度為12. ?那么就從4開始 到45這一組依然按照第(1)順序進行操作。
? ? ? ? ?數(shù)組變成 ------》 [4, 11, 22, 23, 32, 45, 58, 37, 77, 86, 63, 93]
(3)當gap = 1,因為該數(shù)組長度為12. ?那么就從11開始 到93這一組依然按照第(1)順序進行操作。
? ? ? ? ?數(shù)組變成 ------》?[4, 11, 22, 23, 32, 37, 45, 58, 63, 77, 86, 93]
至此排序結(jié)束
?打印每個步驟的數(shù)組:

?至此希爾排序就到這里講解結(jié)束了,細看的話其實一點也不復(fù)雜。