JAVA希爾排序程式碼
阿新 • • 發佈:2021-01-03
希爾演算法學習使用程式碼如下
import untils.AlgorithmUtils;
import java.util.Arrays;
/**
* 以下希爾排序演算法解釋內容來源網上
*
* 希爾排序,也稱 遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是 非穩定排序演算法。
*
* 希爾排序是基於插入排序的以下兩點性質而提出改進方法的:
*
* 插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率
* 但插入排序一般來說是低效的,因為插入排序每次只能將資料移動一
* 希爾排序是先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄進行依次直接插入排序。
*
*/
public class Shell {
/**
* 學習使用
*
* @param arr
*/
public static void studyShellSort(int[] arr) {
System.out.print("原陣列: ");
System.out.println(Arrays.toString(arr));
System.out.println("開始shell排序:--Start-- ");
int length = arr.length;
for (int len = length / 2; len > 0; len /= 2) {
boolean flag = true;
System.out.println("本次步長為: " + len);
for (int i = len; i < length; i++) {
int c = 0;
for (int j = i - len; j >= 0; c = j -= len) {
System.out.println(c + " : 原位置 = " + j + "; 原位置值 = " + arr[j] + "; 對比位置(原位置+步長) = " + (j + len) + "; 對比位置(原位置+步長值) = " + arr[j + len]);
System.out.println("原位置與對比位置比對之前為:");
System.out.println(Arrays.toString(arr));
if (arr[j] > arr[j + len]) {
AlgorithmUtils.swap(arr, j, j + len);
System.out.println("原位置與對比位置比對之後,需要交換:");
System.out.println(Arrays.toString(arr));
} else {
System.out.println("原位置不大於對比位置,不需要交換");
}
}
System.out.println();
}
//本次最終
System.out.println("最終: " + Arrays.toString(arr));
}
System.out.println("shell排序結束:--END-- ");
}
}
public class AlgorithmUtils {
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];
}
}
希爾演算法作為工具類使用程式碼如下
import untils.AlgorithmUtils;
public class Shell {
/**
*
* @param arr 傳入陣列
* @return 返回陣列
*/
public static int[] shellSort(int[] arr) {
int length = arr.length;
for (int len = length / 2; len > 0; len /= 2) {
for (int i = len; i < length; i++) {
for (int j = i - len; j >= 0; j -= len) {
if (arr[j] > arr[j + len]) {
AlgorithmUtils.swap(arr, j, j + len);
}
}
}
}
return arr;
}
}