插入排序与希尔排序

news/2025/2/13 3:04:38/

插入排序

将一元素插入到已排序完毕的数组中

可以将无序数组的第一个元素看作 只有一个元素的有序数组

后将数组中的元素一一插入到有序数组中的合适位置

所有元素被插入到有序数组中时,便已将此数组置为有序

动图演示

在这里插入图片描述

 

代码逻辑如下:

以升序为例

将插入的元素通过 tmp保存

假设 此时有序数组中有 i+1 个元素

将有序数组的最后元素(最大的元素)的下标,记为end

通过end遍历数组,寻出元素插入的合适位置 

		int end = i;int tmp = a[end + 1];while (end >= 0){if (a[end] > tmp){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;

将 tmp 与 a[end]进行比较,

当 a[end] > tmp 时,将 a[end]后移一位,后 end--

接着与tmp进行比较 ,直至找到合适位置

合适位置的两种情况

1. tmp > end

2.tmp小于数组中所有元素

找到合适位置后,循环便结束,将数据存入合适位置 (end + 1)

此为一个元素插入到有序数组中的步骤

对 n 个元素的数组进行插入排序可以理解为

含有一个元素的有序数组中插入 n-1个元素

转化成代码即为

// 插入排序
void InsertSort(int* a, int n)
{int i = 0;for(i=0;i<n-1;i++){int end = i;int tmp = a[end + 1];while (end >= 0){if (a[end] > tmp){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}

 时间复杂度为 O(N^2)

希尔排序

希尔排序是插入排序的进阶排序,大大优化了插入排序的算法效率

基本思想与代码分析实现

假设数组中共有N个元素

取一小于N的正整数gap

将数组中相距为gap的元素分为一组

注意:各组间元素并不重合,在取元素时,第一组以下标为0的元素为第一个元素

                                                                     第二种以下标为1的元素为第二个元素

                                                                                                                          ......

将各组元素进行插入排序

        int j = 0;//对每组元素进行排序for (j = 0; j < gap; j++){int i = 0;//对一组元素进行排序for (i = j; i < n - gap; i += gap){int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}

后将 gap减小重复上述步骤

以升序为例子

当 gap > 1时

此过程称之为预排序,为了方便更好更快的进行插入排序

gap越大,大的元素就更快到后方,小的元素就更快到前方

gap越小,数据便越接近有序

当gap == 1时

便为插入排序

综上所述

void ShellSort(int* a, int n)
{//按照gap 进行插排int gap = n;while (gap > 1){gap = gap / 3 + 1;int j = 0;for (j = 0; j < gap; j++){int i = j;for (i = 0; i < n - gap; i += gap){int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}}}


http://www.ppmy.cn/news/824851.html

相关文章

希尔排序(升序)

希尔排序就是按照不同间隔&#xff0c;对序列进行排序&#xff0c;直到间隔步长为1时&#xff0c;排序后&#xff0c;该序列即为升序序列。 一般步长选取序列长度除以2的k次幂&#xff0c;在不同步长下&#xff0c;将序列各组进行插入排序。大大的减少了插入排序的时间复杂度。…

八大排序算法之4希尔排序算法

希尔排序算法从简单到困难的推导过程 算法思路 1利用交换法实现希尔排序希尔排序使用交换法的粗暴的代码实现用交换排序法的希尔排序算法 2利用插入排序法的希尔排序算法首先要了解什么叫做插入排序算法回忆插入算法 用最粗暴原始的方式利用插入排序来实现希尔排序第一步分成4组…

学习笔记-希尔排序

希尔排序 将一个一维数组从小到大排序。希尔排序是插入排序的优化方式&#xff0c;因为普通的插入排序会存在一个问题&#xff0c;那就是当比较小的数字排在后面时&#xff0c;需要后移很多次才能完成。 思路 由此&#xff0c;希尔排序的思路是&#xff1a;引入一个步长的因…

基础篇--单片机简介

单片机简介 视频教程 单片机是什么 单片机&#xff1a;Single-Chip Microcomputer 单片微型计算机&#xff0c;是一种集成电路芯片 单片机有什么用&#xff1f; 单片机发展历程 单片机发展超势 CISC Vs RISC CISC和RISC举例 https://wenku.baidu.com/view/b074b0ed998fcc22b…

简单快捷的在线 AAB 转换 APK 服务

初雪云-iPA上传发布工具,证书制作工具,ApplicationLoader,上架App Store,安卓市场上架,软著申请服务&#xff0c;windows,linux,mac发布上传提交苹果 在移动应用开发中&#xff0c;AAB&#xff08;Android App Bundle&#xff09;已经成为了一种广泛使用的发布格式。然而&#…

技术是如何创造价值的

一、技术是怎样创造价值的 技术是不能直接创造价值的&#xff0c;它需要媒介。 我们从三个角度来看&#xff1a; 通过创新来创造价值 通过干中学来创造价值 通过解决问题来创造价值 1 通过创新来创造价值 创新&#xff08;innovation&#xff09;这个词源于古董级的人物熊彼特。…

2023 hgame --- week1 wp

文章目录 Miscsign ine99p1ant_want_girlfriend神秘的海报Where am I WebClassic Childhood GameBecome A MemberGuess Who I AmShow Me Your Beauty CryptoRSABe Stream神秘的电话兔兔的车票 Retest_your_IDAeasyasmencodeeasyenca_cup_of_tea Pwntest_nc iotHelp the uncle w…

技术的那些事儿_1_技术是怎样创造价值的

一、技术是怎样创造价值的 技术是不能直接创造价值的&#xff0c;它需要媒介。 我们从三个角度来看&#xff1a; 通过创新来创造价值 通过干中学来创造价值 通过解决问题来创造价值 1 通过创新来创造价值 创新&#xff08;innovation&#xff09;这个词源于古董级的人物熊彼特。…