插入排序和希尔排序小结

记录自己学习插入排序和希尔排序的过程督促自己养成输出内容的习惯!!!

下面是两种基础的排序算法,本质上都是比较和交换    关键在于思想  

(1):插入排序

    public static void sort2(int[] arr){
        // i 定位要插入的元素
        int tmp;
        for(int i=1;i<arr.length;i++){
            for(int j = i ;j > 0 ;j--){
                if(arr[j ] < arr[j - 1]){
                    Util.swap(arr,j,j-1);
                }
            }
        }
    }

插入排序思想很简单,利用两个for循环,外层 i 来定位需要排序的元素所以内层 j 用来指定比较的元素

1:i从1开始取值 也就是默认第一个元素有序

2:内层的 比较直接用 j 和 j - 1不要和外层 i 产生关系

 

(2):希尔排序

public static void sort(int[] arr){
        int N = arr.length;
        int h = 1;
        while(h < N/3){
            h = 3*h + 1;    
        }
        /*
       先将数据变成 h 有序
       然后最后进行一次 插入排序
         */
        while(h >= 1){
            for(int i = h;i < N;i = i + h){
                for(int j = i;j >= h;j = j-h){  
                    if(arr[j-h] > arr[j]){
                        Util.swap(arr,j-h,j);
                    }
                }
            }
            h = h /3;
        }

    }

说明:

思想: 当数据量比较大的时候,插入排序比较慢,因为如果最小的元素在数组最后需要跟前面每一个元素进行比较和交换会很耗时希尔排序的思想就是先将数组变成h 有序也就是不再是相邻的元素进行比较交换,而是跳着来间隔h 的距离来进行交换比较。

说明:

1: h 的选择  递增序列的选择  实际应用中 h = N/3的取值是够用的

2:希尔排序性能在中小型数据量上是可以接受的,并且跟后面介绍的O(nlogn)的高级排序算法性能不会相差两倍(算法书籍上是这么吹的)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值