希尔排序(插排plus)
对数据进行分组 想出这个算法的人,这到底是什么脑子啊!这种设计的思路,真的是夺天地之造化,巧夺天工啊
搞不清怎么玩的,千万不要摁看,去debug自己调一调就明白了
package com.ywystu.SortType;import java.util.Arrays;/*** @author 是狸猫啊!* @Version 1.0* 希尔排序交换法和移动法,很显然移动法的效率更高一点*/
public class ShellSort {public static void main(String[] args) {int[] arr = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
// shellSort(arr);ShellSort(arr);System.out.println(Arrays.toString(arr));}//使用逐步推导的方式public static void shellSort01(int[] arr) {//因为是第一轮排序 所以将数据分为5组for (int i = 5; i < arr.length; i++) {//这里就是从数组的第一个元素进行的 步长为5 这里的j必须大于0 要不第一组的排序是算不进去的j一开始就是0for (int j = i - 5; j >= 0; j -= 5) {if (arr[j] > arr[j + 5]) {int temp = arr[j];arr[j] = arr[j + 5];arr[j + 5] = temp;}}}System.out.println("希尔排序后的结果");System.out.println(Arrays.toString(arr));//这是第二次排序后的结果for (int i = 2; i < arr.length; i++) {//这里就是从数组的第一个元素进行的 步长为5 这里的j必须大于0 要不第一组的排序是算不进去的j一开始就是0for (int j = i - 2; j >= 0; j -= 2) {if (arr[j] > arr[j + 2]) {int temp = arr[j];arr[j] = arr[j + 2];arr[j + 2] = temp;}}}System.out.println("希尔排序后的结果");System.out.println(Arrays.toString(arr));//这里是第三次的排序//这是第二次排序后的结果for (int i = 1; i < arr.length; i++) {//这里就是从数组的第一个元素进行的 步长为5 这里的j必须大于0 要不第一组的排序是算不进去的j一开始就是0for (int j = i - 1; j >= 0; j -= 1) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}System.out.println("希尔排序后的结果");System.out.println(Arrays.toString(arr));}//用交换法进行排序public static void shellSort(int[] arr) {int temp = 0;int count = 0;for (int gap = arr.length / 2; gap > 0; gap /= 2) {for (int i = gap; i < arr.length; i++) {//这里就是从数组的第一个元素进行的 步长为5 这里的j必须大于0 要不第一组的排序是算不进去的j一开始就是0for (int j = i - gap; j >= 0; j -= gap) {if (arr[j] > arr[j + gap]) {temp = arr[j];arr[j] = arr[j + gap];arr[j + gap] = temp;}}}System.out.println("希尔排序"+(++count) +"的结果:");System.out.println(Arrays.toString(arr));}}//用移动法进行解释/*** 第一次跑gap是5,首先的一个数值是arr[5] 也就是第六个数 和arr[0]进行比较 然后交换**/public static void ShellSort(int[] arr){for (int gap = arr.length / 2;gap > 0;gap /= 2){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;}}}}
}
**交换法的劣势:**每次步子确定之后,就需要和隔着步子前面的数进行比较
第一次跑gap是5,首先的一个数值是arr[5] 也就是第六个数 和arr[0]进行比较 然后交换,当间隙变了的时候又会成为一个新的序列,可能长度变化就会很大,继续在while中寻找插入的位置