交换法:

    1. //希尔排序 --> 交换法
    2. public static void shellSort(int[] arr) {
    3. int temp;
    4. //增量:gap,并逐步缩小增量
    5. for (int gap = arr.length / 2; gap > 0; gap /= 2) {
    6. for (int i = gap; i < arr.length; i++) {
    7. //遍历各组中所有的元素(共gap组,每组有arr.length / gap个元素),步长gap
    8. for (int j = i - gap; j >= 0; j -= gap) {
    9. //如果当前元素大于加上步长后的那个元素,说明需要交换
    10. if (arr[j] > arr[j + gap]) {
    11. temp = arr[j];
    12. arr[j] = arr[j + gap];
    13. arr[j + gap] = temp;
    14. }
    15. }
    16. }
    17. }
    18. // System.out.println("排序后:");
    19. // System.out.println(Arrays.toString(arr));
    20. }

    位移法:

    1. //希尔排序 --> 移位法
    2. public static void shellSort2(int[] arr) {
    3. int temp;
    4. int j;
    5. //增量:gap,并逐步缩小增量
    6. for (int gap = arr.length / 2; gap > 0; gap /= 2) {
    7. //从此gap个元素,逐个对其所在的组进行直接插入排序
    8. for (int i = gap; i < arr.length; i++) {
    9. j = i;
    10. temp = arr[j];
    11. if (arr[j] < arr[j - gap]){
    12. while (j - gap >= 0 && temp < arr[j - gap]){
    13. arr[j] = arr[j - gap];
    14. j -= gap;
    15. }
    16. //当退出while后,说明给temp找到插入的位置了
    17. arr[j] = temp;
    18. }
    19. }
    20. }
    21. // System.out.println("排序后:");
    22. // System.out.println(Arrays.toString(arr));
    23. }