专栏首页积累沉淀必须掌握的八种排序(1-2)--插入排序,希尔排序

必须掌握的八种排序(1-2)--插入排序,希尔排序

很多人算法和数据结构不好,归根结底就是基础不扎实,算法和数据结构不好的话,达到的高度肯定不会很高,最近重新加强了一下自己的算法基础,决定从最基础的内容开始,如有不足的地方,欢迎指正。

排序方法可以分为五种∶插入排序、选择排序、交换排序、分配排序和归并排序。 在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序。 首先来看一下八种排序之间的关系图

1、 直接插入排序

(1)基本思想:在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排

好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数

也是排好顺序的。如此反复循环,直到全部排好顺序。

(2)理解图: 已知待序的一组记录的初始排列为:21, 25, 49, 25*, 16, 08

开始排序

(3)代码实现

//插入排序算法
    public static  void insertSort(int [] a){

        //插入排序算法 
        //假设当前待比较项前面的数都是已经排好序的,则拿当前待比较项与前面最后一个数比较
        //如果比前面的数小,则把前面的数后移,索引减一  直到它比前面的数大则退出当前循环
        for(int i=1;i<a.length;i++){//假设第一个元素是排好序的,从第二个元素循环整个数组
            //记录当前元素的索引
            int j=i;
            int temp=a[j];
            //循环将当前的值与前面的值进行比较,如果当前的值比前面的元素小,则将前面的值向后移(复制),再将索引向前移动,直到移动到数组的开头索引0位置
            while(j>0&&temp<a[j-1]){
                a[j]=a[j-1];
                j--;
            }
            //将当前的值放到合适的位置
            a[j]=temp;
        }
    }

直接插入排序最大的优点是简单,在记录数较少时,是比较好的办法。

2、希尔排序(最小增量排序)

(1)基本思想:算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。

(2)理解图

(3)代码实现

public void shellSort(int[] a) {
        int temp = 0;
        double d1 = a.length;
        while (true) {

            d1 = Math.ceil(d1 / 2);
            int d = (int) d1;

            for (int x = 0; x < d; x++) {
                for (int i = x + d; i < a.length; i += d) {
                    int j = i - d;
                    temp = a[i];
                    for (; j >= 0 && temp < a[j]; j -= d) {
                        a[j + d] = a[j];
                    }
                    a[j + d] = temp;
                }
            }
            if (d == 1) {
                break;
            }
        }

        for (int i = 0; i < a.length; i++)

            System.out.print(a[i] + "\t");
    }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JDK源码分析-ArrayList分析

    花了两个晚上的时间研究了一下ArrayList的源码, ArrayList 继承自AbstractList 并且实现了List, RandomAccess,...

    汤高
  • 必须掌握的八种排序(7-8)--归并排序,基数排序

    7、归并排序 (1)基本排序:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后...

    汤高
  • JavaScript基础1

    什么是Javascript? Javascript是一种基于对象和事件驱动的, 与平台无关的 ,具有安全性的 ,弱类型的脚本语言。 为什么要用? 使...

    汤高
  • Netty ByteBuf源码解读

      Netty里的ByteBuf主要用于发送或接收消息。在JDK里有相似功能的类java.nio.ByteBuffer。由于JDK在设计ByteBuffer A...

    良辰美景TT
  • n皇后问题

    1295 N皇后问题  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果 题目描述 Descripti...

    attack
  • 曹操哪里跑!--Java语言实现数字华容道游戏

    你好戴先生
  • 详解排序算法--插入排序和冒泡排序插入排序和冒泡排序分析

    冒泡排序(英语:Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把...

    desperate633
  • 挑战程序竞赛系列(73):4.7高度数组(3)

    挑战程序竞赛系列(73):4.7高度数组(3) 传送门:POJ 3729: Facer’s String 题意: 公共子串: 给出两个字符串A,B,求...

    用户1147447
  • 3259. Wormholes

    重新回顾了下Bellman-Ford算法,核心思路如下:从单个源点出发,如果经过N轮还在更新时,说明存在负环。证明:假设不存在负环,那么最短路径必然不会经过一个...

    用户1147447
  • 挑战程序竞赛系列(37):3.4利用数据结构高效求解

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1147447

扫码关注云+社区

领取腾讯云代金券