Java_七大排序知识总结 之 插入排序_希尔排序

目录

1.插入排序

      1.1直接插入

                排序思想:

                排序过程:

                Java代码解决问题:

                 性能分析:

                 稳定性:

                 优化:

                 Java代码实现:

      1.2希尔排序

            排序思想:

             Java解决问题代码

             性能分析

              稳定性


1.插入排序

      1.1直接插入

                排序思想:

                              需要将待排序数组分为两个部分,已排序区间和未排序区间。每次选择未排序                         区间的第一个元素放入到已排序区间的相应位置。

                排序过程:

                              每一轮插入过程如下图:

                Java代码解决问题:

public class InsertSort {
    public static void main(String[] args) {
        int[] arr = new int[]{5,8,6,3,9,2,1,7};
        insertSort(arr);
        System.out.println("insertSort: ");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }

    public static void insertSort(int[] arr) {//直接插入排序
        for(int i = 1; i < arr.length; i++) {
            int tmp = arr[i];//将对无序数组的第一个元素进行插入
            int j = i - 1;
            for(; j >= 0 && arr[j] > tmp; j--) {
                arr[j + 1] = arr[j];//有序数组中每一个大于待插入值的元素后移
            }
            arr[j + 1] = tmp;//插入
        }
    }
}

                 性能分析:

时间复杂性空间复杂性
最好情况平均情况最坏情况
O(n)O(n^2)O(n^2)O(1)
数组顺序数组逆序

                 稳定性:

                                  稳定的排序,当原数组越接近有序,插入效率越高。

                 优化:

                                  普通的插入排序代码需要一个个对比确定插入位置。因此优化思想是采用二                         分查找的方法寻找需要插入的位置。

                 Java代码实现:

public static void birInsertSort(int[] arr) {//用二分查找优化后的插入排序
        for(int i = 1; i < arr.length; i++) {
            int tmp = arr[i];
            int left = 0;
            int right = i;
            while(left < right) {//二分法找需要插入的位置
                int mid = left + (right - left) / 2;
                if(tmp >= arr[mid]) {
                    left = mid + 1;
                }else {
                    right = mid;
                }
            }
            for(int j = i; j > left; j--) {
                arr[j] = arr[j - 1];
            }
            arr[left] = tmp;
        }
    }

      1.2希尔排序

            排序思想:

                           希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待                      排序文件中所有记录分成个组,所有 距离为的记录分在同一组内,并对每一组内的记                      录进行排序。然后取重复上述分组和排序的工作。当到达=1时, 所有记录在统                               一组内排好序。

             Java解决问题代码

public static void shellSort(int[] arr) {
        int gap = arr.length;
        while(gap > 1) {
            shellSortGap(arr, gap);
            gap = (gap / 3) + 1;
        }
        shellSortGap(arr, gap);
    }

    public static void shellSortGap(int[] arr, int gap) {
        for(int i = 1; i < arr.length; i++) {
            int tmp = arr[i];
            int j = i - gap;
            for(; j >= 0 && arr[j] > tmp; j -= gap) {
                arr[j + gap] = arr[j];
            }
            arr[j + gap] = tmp;
        }
    }

             性能分析


 

时间复杂度空间复杂度
最好情况平均情况最坏情况O(1)
O(n)O(n^1.3)O(n^2)
数组有序结构难以构造

              稳定性

                           不稳定排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值