数据结构:排序—插入排序(一)

一、排序

1、概念

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的,否则称为不稳定的。

我们来看下面这个图想必大家会更加的理解

内部排序:数据元素全部放在内存中的排序。

外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不断的在内外存之间移动数据的 排序。

2、常见的排序算法

排序算法共有四大类七种排序算法:

二 、插入排序

1、直接插入排序

直接插入排序是一种简单的插入排序法。

基本思想是: 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列

直接插入排序实现:

基本思路:我们先把我们要排序的值放到一个临时变量当中,让这个临时变量的值与他前面已经排好的数值依次进行比较,如果小于前面的值,就让前面的值覆盖他后一位的值,直到走完或者遇到不临时变量的值还小的数停止,并让停止后位置的后一位的值为临时变量的值

java 复制代码
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; j--) {
                if(arr[j] > tmp){
                    arr[j+1] = arr[j];
                }else{
                    break;
                }
            }
            arr[j+1] = tmp;
        }
    }

2、希尔排序

希尔排序法又称缩小增量法。

基本思想是:先选定一个整数gap,把待排序文件中所有数据分成多个组,所有距离为gap的数据分在同一组内,并对每一组内的数据进行排序。然后,重复上述分组和排序的工作。当gap=1时,所有数据在统一组内排好序。

希尔排序实现:

基本思路:首先不管我们如何进行分组,当我们到最后一组的时候我们依然会进行插入排序,而此时我们在分成每一组的时候,我们都会进行插入排序,当我们变成最后一组数据的时候,我们发现此时的数据已经比较有序列,此时在进行插入排序,我们的排序速度就会更快。

首先我先将他进行分组,组中数据距离为此时所有数据总长的一半,然后我们进行插入排序,在进行直接插入排序时我们的 i 是从 1 下标开始,而此时我们的 i 下标要从gap处开始,j下标就要从i-gap开始,并且每比较依次我们的 j 下标就减去一个gap。当这个组排完序后,我们再以此时gap的一半进行分组不断重复上面的操作,直到gap=1,并排完序后。

java 复制代码
public static void  shellSort(int[] arr){
        int gap = arr.length/2;
        while (gap > 0){
            shell(arr,gap);
            gap /=2;
        }
    }

    public static void shell(int[] arr,int gap){
        for (int i = gap; i < arr.length; i++) {
            int tmp = arr[i];
            int j = i-gap;
            for (; j >= 0 ; j-=gap) {
                if(arr[j] > tmp){
                    arr[j+gap] = arr[j];
                }else{
                    break;
                }
            }
            arr[j+gap] = tmp;
        }
    }

好了今天的分享就到这里了,还请大家多多关注,我们下一篇见!

相关推荐
Wang's Blog6 分钟前
Java 项目实战: 外卖平台-后台退出功能与首页iframe架构
java·服务器·redis
Wang's Blog8 分钟前
Java 项目实战: 外卖平台-软件开发流程与项目整体介绍
java·服务器·redis
她说..8 分钟前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
步行cgn9 分钟前
BeanFactory 与 FactoryBean 的区别:面试深度解析
java·后端·spring
IT 行者16 分钟前
JDK 27 正式发布:内存、安全、并发三路齐发
java
6Hzlia2 小时前
【Classic 150 刷题计划】 LeetCode 205. 同构字符串 | C++ 双向绑定与哈希表映射
c++·算法·leetcode
伍一513 小时前
hiprint-spring-boot打印组件介绍
java·hiprint
Wang's Blog8 小时前
Java 接入Redis: 服务启动停止与后台运行配置
java·服务器·redis
此时不提桶,更待何时9 小时前
01-04-B-垃圾回收面试与生产事故实战
java·jvm·面试
有点。9 小时前
C++03阶段练习(练习题)
数据结构·算法·图论