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

一、排序

1、概念

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

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

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

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

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

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;
        }
    }

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

相关推荐
雨奔5 小时前
Kubernetes DNS 完全指南:服务发现核心机制与实践
java·kubernetes·服务发现
DuHz5 小时前
论文精读:大语言模型 (Large Language Models, LLM) —— 一项调查
论文阅读·人工智能·深度学习·算法·机器学习·计算机视觉·语言模型
加农炮手Jinx6 小时前
LeetCode 72. Edit Distance 题解
算法·leetcode·力扣
借雨醉东风6 小时前
程序分享--常见算法/编程面试题:旋转矩阵
c++·线性代数·算法·面试·职场和发展·矩阵
逻辑驱动的ken6 小时前
Java高频面试考点场景题14
java·开发语言·深度学习·面试·职场和发展·求职招聘·春招
阿冰冰呀6 小时前
互联网大厂Java求职面试实录:谢飞机的“水货”之路
java·mybatis·dubbo·springboot·线程池·多线程·hashmap
_深海凉_6 小时前
LeetCode热题100-打家劫舍
算法·leetcode·职场和发展
水无痕simon6 小时前
1.单机部署Nacos1.3.2
java
jghhh017 小时前
使用 MATLAB 实现支持向量回归 (SVR) 预测未来数据
算法·matlab
云泽8087 小时前
笔试算法 - 双指针篇(二):四大经典求和题型 + 有效三角形计数问题
c++·算法