【算法】插入排序

算法系列五:插入排序

一、直接插入排序

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稳定性

不稳定

相关推荐
菜鸡中的奋斗鸡→挣扎鸡3 分钟前
总结:查找子字符串出现次数
c++·算法·蓝桥杯
刃神太酷啦11 分钟前
基础算法篇(4)(蓝桥杯常考点)—数据结构(进阶)
数据结构·c++·算法·蓝桥杯·哈希算法·蓝桥杯c++组
Zz_waiting.15 分钟前
多线程代码案例(定时器) - 3
开发语言·算法·安全·javaee
飞川撸码18 分钟前
【LeetCode 热题100】139:单词拆分(动态规划全解析+细节陷阱)(Go语言版)
算法·leetcode·golang·动态规划
三月七(爱看动漫的程序员)1 小时前
LLM面试题八
数据库·gpt·算法·langchain·prompt·启发式算法·llama
Pitayafruit1 小时前
🔍抖音首次公开推荐算法原理:大白话讲讲它是如何让你刷到停不下来
人工智能·深度学习·算法
Hole_up1 小时前
1. 两数之和 leetcode
python·算法·leetcode·职场和发展·蓝桥杯
wen__xvn1 小时前
蓝桥杯每日刷题c++
c++·算法·蓝桥杯
飞天狗1111 小时前
codeforces B. Large Array and Segments
c++·算法·贪心算法
_extraordinary_1 小时前
笔试专题(七)
数据结构·算法·哈希算法·贪心·线性dp