【算法】插入排序

算法系列五:插入排序

一、直接插入排序

1.原理

2.实现

3.性质

3.1时间复杂度

3.2空间复杂度

3.3稳定性

二、希尔排序

1.原理

1.1优化方向

1.2优化原理

2.设计

2.1比较无序时

2.2比较有序时

3.实现

4.性质

4.1时间复杂度

4.2空间复杂度

4.3稳定性


解放变量

多变量存储数据可实现其中的变量被解放了可去不失数据覆盖存别的值,被解放变量覆盖存别的值又是从变量里来的又能再解放出下一对数据解放传递着 ,++能实现数据在变量间的调整交换位置存放,实现排序的基础++


一、直接插入排序

1.原理

插排就是要排的数据举着往前面维护着的有序数列在解放交换数据的模式下找到它大小的位置解放安全地覆盖放入 ,++从前往后一个个插入排好序进去,维护成的有序数列从前往后越来越大,直到把所有数据都插入维护进去++,插排排序就完成了


2.实现

java 复制代码
public static void insertSort(int[] array) {
        for (int i = 1; i < array.length; i++) {
            int tmp = array[i];
            int j = i-1;
            for (; j >= 0 ; j--) {
                if(array[j] > tmp) {
                    array[j+1] = array[j];
                }else {
                    break;
                }
            }
            array[j+1] = tmp;
        }
    }

3.性质

3.1时间复杂度

首先第一个元素去维护进有序数列时,它一进去只有它一个一定就直接有序了不需要维护成有序 ,++从第二个元素起,每个元素都要举着往有序数列前找它大小的解放位置放++ ,n个元素一共要去往前检查维护n-1次

  • 完全有序 的情况下,每次里面的for循环一进去执行就break,时间复杂度为O(n)
  • 完全逆序 的情况下,++每个数据维护进当前有序数组都要遍历比较到有序数组末尾++ ,执行次数为1~n-1递增的等差数列和次数,时间复杂度为O(n^2)

3.2空间复杂度

O(1)


3.3稳定性

稳定


二、希尔排序

希尔排序是直接插入排序的优化版

1.原理

1.1优化方向

直接插入排序中,因为++n个元素要去检查维护n-1次是固定变不了的++ ,要优化就只能从尽可能减少每次的检测维护里往前检查搜寻次数、交换次数来实现


1.2优化原理

待对它插排的整体数组越有序即数组里面每个数据最开始离它们各自的最终排序位置都越近,那么n-1次每个元素对待的前面已排好序的数组就会都是兼容性顺序很好很接近它们在当前数组的排序位置且也是最终整体数组相对排序的位置

每个元素去维护数组时经常都是没检查搜寻几次交换几次就到达了当前维护数组的排序位置就break了且该位置也是最终整体排好序数组的相对位置说明数据先后进来维护都自然地从前往后排的不怎么需要往前检查移动交换 ,++因为它们这些数据本身就很接近最终数组排序位置,排序时按顺序从前往后进来维护它们也是进来就直接处在要排的位置上了,按顺序来直接到直接是最终位置++


2.设计

2.1比较无序时

比较无序时,每次维护里连续重复地进前面有序数组维护交换次数会很多且不靠近最终整体数组有序位置,所以:

无序时大跨越式地横跨取数进维护有序组,会发现++最终维护的组会很多因为跨数太大了它们无法前后续上++ ,所以它们的比较不是很会连续重复进行 ,且它们的交换跨度很大,能用一次少的比较成本实现数据的大幅度交换小成本实现数据的大致整体左小右大排列


2.2比较有序时

无序时的大跨越式横跨小成本实现整体数组大致左小右大比较有点序后

跨越式取数的gap适当变小缩为原来的一半,因为此时面对的是较有点序的整体数组,我们的排序就以它更有点序下对应用到它有点序的程度来深入,一路上全合适的程度全效地利用着它的渐有序进行排列,++到后面随着数组越来越有序,分的组越来越少,精确程度地深入去排已经很有序的数据高效地全完成++


3.实现

java 复制代码
public static void shellSort(int[] array) {
        int gap = array.length;
        while (gap > 1) {
            gap /= 2;
            shell(array,gap);
        }
    }
    private static void shell(int[] array,int gap) {
        for (int i = gap; i < array.length; i++) {
            int tmp = array[i];
            int j = i-gap;
            for (; j >= 0 ; j-=gap) {
                if(array[j] > tmp) {
                    array[j+gap] = array[j];
                }else {
                    break;
                }
            }
            array[j+gap] = tmp;
        }
    }

4.性质

4.1时间复杂度

O(n^1.3)


4.2空间复杂度

O(1)


4.3稳定性

不稳定

相关推荐
不正经学生2 小时前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
毕竟是shy哥5 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲5 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
晊晌_h6 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦7 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考7 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客8 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
小白羊丨11 小时前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
OPEN-F12 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法
lisin-lee-cooper12 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法