排序算法【1】---对直接插入排序的优化---shell排序详解

简单直接插入排序以及其优化排序-shell排序

最近在复习数据结构部分内容,个人对直接插入排序的优化-shell排序产生了兴趣,用简单的操作就可以将时间复杂度减少十倍以上!

先写一个简单的直接插入排序了解一下。

1.直接插入排序
public class SortDemo {
    /*
    1.直接插入排序
    思想:类似于接扑克牌
    时间复杂度 O(n^2)  最好:O(n)
    越有序越快
    空间复杂度O(1)
    稳定性:稳定(没有发生跳跃式交换)

     */
    public static  void insertSort(int[] array){
        long  start  = System.currentTimeMillis();
        for (int i = 1; i < array.length; i++) {
            int temp = array[i];
            int j = 0;
            for ( j = i - 1 ; j >= 0 ; j--) {
                 if(array[temp] < array[j]){
                     array[j+1] = array[j];
                 }else{
                     break;
                 }
            }
            array[j+1] = temp;
        }
        long end = System.currentTimeMillis();
        System.out.println("执行时间:"+(end - start));
    }

主要思想:
类似于接扑克牌的过程。
第一个数默认有序,从第二个数开始,将数据放入temp临时存放,并且和前面的数array[j]进行比较。
1)array[j] > temp ,将array[j]中的数存放到array[j+1]里,再依次和左边的数比较,直到找到array[j] < temp或者j<0。退出
2)array[j] < temp,直接退出就好了。
最后把temp存放的值放在array[j+1]中即可。

2.对直接插入排序的优化 — shell排序

主要思想:
shell排序实际上就是将数据分成若干个组,对每一组进行直接插入排序。

这样做假设有100个数据,如果直接插入排序则时间复杂度最坏情况为100100 = 10000
而shell排序入股分成10组,每组10个数据,则时间复杂度最坏为10
10*10 = 1000
直接把复杂度降低了十倍!

在分组的时候,采用如图分组方法,
在这里插入图片描述
这里将其分成5组,每隔5个数据的分在一组。具体实现如下:
在这里插入图片描述

 /*
    2.shell排序:对直接插入排序的优化
    思想:将数据分组,组内进行直接插入排序
     */
    public static  void shell(int[] array,int gap){
    //gap为分组后每个组的数据个数
        for (int i = gap; i < array.length ; i++) {
            int temp = array[i];
            int j = 0;
            for ( j = i - gap; j >= 0 ; j -= gap) {
                if(array[j] > temp){
                
                    array[j+gap] = array[j];
                }else{
                    break;
                }
            }
            array[j+gap] = temp;
        }
    }

    public static  void shellSort(int[] array){
        int[]arr ={5,3,1};
        long  startTime = System.currentTimeMillis();
        for (int i = 0; i <arr.length ; i++) {
            shell(array,arr[i]);
        }
        long  endTime = System.currentTimeMillis();
        System.out.println("shell排序处理时间为:"+(endTime - startTime));
    }
    ```
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值