java实现[排序算法]插入排序,希尔排序

本文介绍了两种排序算法:直接插入排序和希尔排序。直接插入排序通过比较已排序部分与未排序部分的数据来逐步构建有序序列;希尔排序则是对直接插入排序的一种改进,通过设置不同的间隔来分组元素并进行排序。

直接插入排序

中心思想:
每次拿出一个数和已经排序好的一组数比较,假设a={10,23,56,12,16,25} , 比如在i=3时:a[0]~a[2]已经排好序为[10,16,25],这时要插入a[3]这个数,先和a[2]比较也就是25比较,如果大于25则直接插入在index=3这个位置,如果小于,则让25向后移一位也就是在index=3的位置 , 准备把index=2的位置给a[3]这个数 , 因为最少也会在index=2这个位置 , 然后拿a[3]与a[1]比较 , 小于 , 则a[1]这个数也向后移一位 , 在index=2的位置,让位给大佬 , 大佬和a[0]比较 , 大于 , 则跳出比较 , 站好a[2]让出的index=2的位置

private static void insertSort(int[] a) {
        int temp;
        int j;
        for (int i = 1; i < a.length; ++i) {
            temp = a[i];
            for (j = i - 1; j >= 0; --j) {
                if (temp >= a[j]) {
                    break;
                }
                a[j + 1] = a[j];
            }
            a[j + 1] = temp;
        }
    }

希尔排序

中心思想:
确定要比较几次 , 也就是要分别比较多少间隔 , 根据数学就是先是取间隔为length/2,之后就是length/2/2直到间隔没有 , 也就是index差值为1 , 对10个数的数组来说就是先是index差值是5的两个数相互比较 , 然后是差值是3的 , 然后是差值是1的(就是相邻的数) , 当进行一轮比较的时候 , 先拿后半段的第一个数和前半段第一个数比较也就是间隔所在数 , 不符合大小相对位置的就交换 , 然后拿后半段第二个数和前半段第二个数比较….这里实现的很巧妙 , 用一个for循环来控制j的取值 , 当后数大于前数时 , 跳出循环 , 这时j=i-gap,然后执行 a[j+gap]=temp;相当于a[i]=temp;也就是保持不变 , 如果后数小于前数 , 则将前数赋值给后数位置 , 而后执行j=j-gap , 之后再执行 a[j+gap]=temp;相当于a[j]=temp;将后数值赋值给前数位置

 public static void shellSort(int[] a) {
        int temp;
        int j;
        for (int gap =a.length/2 ; gap >0 ; gap=gap/2) {

            for (int i = gap; i <a.length ; ++i) {
                temp=a[i];
                for (j = i-gap; j >=0 ; j=j-gap) {
                    if (a[j]>temp){
                        a[i]=a[j];
                }else {
                        break;
                    }
            }
            a[j+gap]=temp;
        }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值