经典算法之希尔排序法(Java实现)
?活動地址:21天學習挑戰賽
目錄
一、算法
1.算法概述
2.基本思想?
3.算法步驟
?4.算法特點
二、算法實踐
1.Java代碼
2.執行結果
三、復雜度分析
1.時間復雜度
2.空間復雜度
一、算法
1.算法概述
????????希爾排序法又稱為縮小增量排序法,是一種基于插入思想的排序方法。它是直接插入排序法的進一步優化的算法,使得排序的性能有了一個極大的飛躍!?
2.基本思想?
????????希爾排序法的偉大之處在于很好的利用了直接插入法的最佳性質:待排序記錄較少且基本有序。所以希爾排序法的思路是將待排序的序列按照增量遞減的方式分成若干個組,將原來較大的序列不斷切割成一個個小的子序列,使子序列符合“數目少且基本有序”這一條件,然后分別對各個子序列進行直接插入排序,經過上述的操作后,使得整個序列已經基本有序,然后對整個序列進行一次直接插入排序,即可得到一個整體有序的序列,排序完成!
往期相關文章傳送門:
- ?直接插入排序與希爾排序對比學習
- 經典算法之直接插入排序法?
3.算法步驟
?
(注:圖片來自網絡)?
?
?4.算法特點
?
二、算法實踐
1.Java代碼
package TwentyOne_Challenge;public class DaySeven {public static void main(String[] args) {int []a={3,38,5,44,15,36,26,27,2,47,46,4,19,50,48,100};System.out.print("原來序列如下:");for (int i = 0; i <a.length ; i++) {System.out.print(a[i]+" ");}sort(a);System.out.println();System.out.print("經過希爾排序后:");for (int i = 0; i <a.length ; i++) {System.out.print(a[i]+" ");}}private static void sort(int arr[]) {int n=arr.length,d = n;while (d>1) {//每次對增量d進行折半d/=2;//單趟排序for (int i = 0; i < n - d; i++) {int right = i;int temp = arr[right + d];//存儲待排序元素while (right >= 0) {if (temp < arr[right]) {//組內排序arr[right + d] = arr[right];//組內的下一元素,從右往左right -= d;}else {break;}}//如果組內某一對元素已經有序則無需交換,將存儲的待排序元素重新賦給原值arr[right + d] = temp;}}}
}
2.執行結果
?
?
?
三、復雜度分析
1.時間復雜度
????????當增量大于1時,關鍵字較小的記錄就不是一步一步地挪動,而是跳躍式地移動,從而使得,在進行最后一趟增量為1 的插人排序中,序列已基本有序,只要做記錄的少量比較和移動即可完成排序,因此希爾排序的時間復雜度較直接插人排序低。
????????但要具體進行分析,則是一個復雜的問題,因為希爾排序的時間復雜度是所取“增量”序列的函數,這涉及一些數學上尚未解決的難題。因此,到目前為止尚未有人求得一種最好的增量序列,所以希爾排序的時間復雜度無法準確得出。
2.空間復雜度
? ? ? ? 希爾排序需要借助一個輔助空間,所以其空間復雜度為?O(1)??
?
總結
以上是生活随笔為你收集整理的经典算法之希尔排序法(Java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle用case计算分段函数,分段
- 下一篇: webService和WebApi的区别