插入排序(包含希尔排序)

插入排序

思想:

  1. 将数组元素分为两组,一组有序(初始化为第一个元素为第一组),一组无序(后面的元素为第二组)。

  2. 在排序时,将第二组的元素插入插入到第一组中,并按照排序规则,找到其相应的位置插入。

代码实现:

import java.util.Arrays;

public class InsertSort {
    public void SortByInsertByTest(int[] arr) {
        for (int n = 0; n < arr.length - 1; n++) {
        int insertValue=arr[n+1];
        int insertIndex=n;
        /*
        1.insertIndex>=0保证数组下标不会越界
        2.insertValue<arr[insertIndex]保证此时待插入数组还没有找到合适位置
        3.arr[insertIndex+1]=arr[insertIndex];将有序的数组后移
        4. insertIndex--;继续向前寻找位置。
        5.当退出while循环时,说明已经找到合适的位置,插入即可。
         */
        while (insertIndex >= 0 && insertValue<arr[insertIndex]) {
            arr[insertIndex+1]=arr[insertIndex];
            insertIndex--;
        }
        arr[insertIndex+1]=insertValue;
        System.out.println("第"+n+"排序后的结果为:"+Arrays.toString(arr));
        }
    }
}

希尔排序

思想:

将待排序的数组按照length/2分组,采用缩小增量法进行排序。

代码实现(交换法):

数组:

  int[] arr = {8,9,1,7,2,3,5,4,6,0};

逐步推导:

//使用逐步推倒的方法
    public static void sortByShellTest(int[] arr) {
        int temp=0;
        //希尔排序的第一轮排序
        //因为第一轮排序是将10个数据分成5组
        for (int i = 5; i <arr.length ; i++) {
            //遍历各组中的所有的元素(共5组,每组有两个元素),步长为5
            for (int j = i-5; j >=0 ; j-=5) {
                if (arr[j] > arr[j + 5]) {
                    temp = arr[j];
                    arr[j] = arr[j + 5];
                    arr[j+5]=temp;
                }
            }
        }
        System.out.println("希尔排序第一轮后的结果为:"+ Arrays.toString(arr));
        //希尔排序第二轮排序
        //应为第二轮排序是将10个数据分成5/2组
        for (int i = 2; i < arr.length; i++) {
            for (int j=i-2;j>=0;j=j-2){
                if (arr[j] > arr[j + 2]) {
                    temp = arr[j];
                    arr[j] = arr[j + 2];
                    arr[j+2]=temp;
                }
            }
        }
        System.out.println("希尔排序第二轮后的结果为:"+ Arrays.toString(arr));
        //希尔排序第三轮排序
        //应为第二轮排序是将10个数据分成5/2/2组
        for (int i = 1; i < arr.length; i++) {
            for (int j=i-1;j>=0;j=j-1){
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j+1]=temp;
                }
            }
        }
        System.out.println("希尔排序第三轮后的结果为:"+ Arrays.toString(arr));

    }

归纳:

        public static void shellSort(int[] arr){
        for (int gap = arr.length / 2; gap > 0; gap /= 2) {
            int temp=0;
            for (int i = gap; i <arr.length ; i++) {
                for (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("希尔排序后的结果是:"+Arrays.toString(arr));
    }

代码优化(移动法):

    //对交换式的希尔排序进行优化->移位发
    public static void shellSort2(int[] arr){
        //增量gap,并逐步缩小增量
        for (int gap = arr.length/2; gap >0 ; gap/=2) {
            //从第gap个元素开始,逐个对其所在的组进行直接插入排序
            for (int i = gap; i < arr.length; i++) {
                int insertValue=arr[i];
                int insertIndex=i-gap;
                while (insertIndex >= 0 && insertValue < arr[insertIndex]) {
                    arr[insertIndex + gap] = arr[insertIndex];
                    insertIndex-=gap;
                }
                arr[insertIndex+gap]=insertValue;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
posted @ 2022-09-23 15:37  与否业务NOW  阅读(24)  评论(0)    收藏  举报