add shell sort

dev
ehlxr 2020-10-02 22:34:28 +08:00
parent 54413a6212
commit f10cb74205
2 changed files with 71 additions and 3 deletions

View File

@ -31,9 +31,8 @@ public class InsertSort {
break;
}
}
System.out.println(Arrays.toString(arr));
}
System.out.println(Arrays.toString(arr));
}
public static void swap(int[] arr, int i, int j) {
@ -47,6 +46,6 @@ public class InsertSort {
}
public static void main(String[] args) {
sort(new int[]{4, 9, 1, 6, 8, 2});
sort(new int[]{4, 9, 1, 8, 6, 2});
}
}

View File

@ -1,8 +1,77 @@
package me.ehlxr.sort;
import java.util.Arrays;
/**
*
* <p>
*
*
*
* @author ehlxr
* @since 2020-10-01 16:40.
*/
public class ShellSort {
/**
* gap
*
* gap ~ gap=1
* <p>
* 1
* 1
*/
public static void sort(int[] arr, int gap) {
if (arr == null || arr.length <= 0 || gap < 1) {
return;
}
for (int i = 0; i < gap; i++) {
// 对按照 gap 进行分组的元素进行插入排序
for (int j = gap + i; j < arr.length; j += gap) {
for (int k = j - gap; k >= 0; k -= gap) {
if (arr[k] > arr[k + gap]) {
swap(arr, k, k + gap);
} else {
break;
}
}
}
}
System.out.println(Arrays.toString(arr));
// 每次将 gap 折半减小,循环上述操作
sort(arr, gap / 2);
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
public static void main(String[] args) {
int[] arr = {4, 9, 1, 8, 6, 2};
sort(arr, arr.length / 2);
// sort(arr);
}
// public static void sort(int[] arr) {
// int gap = arr.length / 2;
// for (; gap > 0; gap = gap / 2) {
// //不断缩小gap直到1为止
// for (int j = 0; (j + gap) < arr.length; j++) {
// //使用当前gap进行组内插入排序
// for (int k = 0; (k + gap) < arr.length; k += gap) {
// //交换操作
// if (arr[k] > arr[k + gap]) {
// arr[k] = arr[k] + arr[k + gap];
// arr[k + gap] = arr[k] - arr[k + gap];
// arr[k] = arr[k] - arr[k + gap];
// }
// }
// }
// System.out.println(" Sorting: " + Arrays.toString(arr));
//
// }
// }
}