前言
這個排序算法,其實就是一個插入排序的改進,可以作爲知識的擴展來學習,由於平時用的不多,所以先記錄在這裏,以後要用不至於沒有頭緒。
原理
希爾排序在數組中採用跳躍式分組的策略,通過某個增量將數組元素劃分爲若干組,然後分組進行插入排序,隨後逐步縮小增量,繼續按組進行插入排序操作,直至增量爲1
時間複雜度
平均情況:介於n和n*n之間
最壞情況:n*n
最好情況:n
代碼
public class ShellSort {
// 插入排序的改進
// 希爾排序在數組中採用跳躍式分組的策略,通過某個增量將數組元素劃分爲若干組,然後分組進行插入排序,
// 隨後逐步縮小增量,繼續按組進行插入排序操作,直至增量爲1。
// https://www.cnblogs.com/chengxiao/p/6104371.html
//時間複雜度 最好 n 最壞 n*n 平均情況,是介於二者之間
public static void main(String[] args) {
int[] arr={6,3,8,2,9,1};
System.out.println("排序前數組爲:");
for(int num:arr){
System.out.print(num+" ");
}
sort(arr);
System.out.println();
System.out.println("排序後的數組爲:");
for(int num:arr){
System.out.print(num+" ");
}
}
public static void sort(int[] arr) {
// 增量gap,並逐步縮小增量
for (int gap = arr.length / 2; gap > 0; gap /= 2) {
// 從第gap個元素,逐個對其所在組進行直接插入排序操作
for (int i = gap; i < arr.length; i++) {
int j = i;
while (j - gap >= 0 && arr[j] < arr[j - gap]) {
// 插入排序採用交換法
swap(arr, j, j - gap);
j -= gap;
}
}
}
}
public static void sort1(int[] arr) {
// 增量gap,並逐步縮小增量
for (int gap = arr.length / 2; gap > 0; gap /= 2) {
// 從第gap個元素,逐個對其所在組進行直接插入排序操作
for (int i = gap; i < arr.length; i++) {
int j = i;
int temp = arr[j];
if (arr[j] < arr[j - gap]) {
while (j - gap >= 0 && temp < arr[j - gap]) {
// 移動法
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
}
}
}
public static void swap(int[] arr, int a, int b) {
arr[a] = arr[a] + arr[b];
arr[b] = arr[a] - arr[b];
arr[a] = arr[a] - arr[b];
}
}
如果還不能理解的話,可以參考下面這篇博客,講的詳實正確,生動形象,重點是有圖哦,0.0
https://www.cnblogs.com/chengxiao/p/6104371.html