八大排序算法(1)插入排序-直接插入排序 和 希尔排序

devtools/2025/2/25 1:15:19/

直接插入排序(Insertion Sort)

直接插入排序是最基本的插入算法>排序算法,工作原理如下:

从第二个元素开始,将其与前面已经排好序的部分进行比较。

找到合适的位置后,将该元素插入到合适的位置,同时后面的元素右移。

重复上述步骤,直到所有元素都排好序。

时间复杂度

最好情况:O(n)(当数据已经是有序的情况下)

最坏情况:O(n^2)(当数据逆序时)

平均情况:O(n^2)

希尔排序(Shell Sort)

希尔排序是对直接插入排序的一种改进。希尔排序的基本思路是通过增大间隔,将数据分成若干子序列,每个子序列分别进行插入排序。随着排序的进行,逐步减小间隔,直到间隔为1时,进行常规的插入排序。

希尔排序的改进:

通过分组插入排序,减少了直接插入排序中的大量元素移动,从而提高了效率。

初始时,元素之间的间隔较大,可以让较远的元素更快地被“交换到”更接近的正确位置。

随着间隔的减小,数据逐渐有序,最后的插入排序不需要进行大量的元素移动。

时间复杂度

最坏情况:O(n^2)(取决于增量序列的选择)

最好情况:O(n log n)(如果使用合适的增量序列)

平均情况:通常比直接插入排序快很多,但具体时间复杂度依赖于增量序列的选择。

特性直接插入排序希尔排序
原理将元素插入到已排序部分的合适位置通过增大间隔逐步进行插入排序,间隔逐步缩小,最终间隔为 1
时间复杂度最坏:O(n²),最好:O(n),平均:O(n²)最坏:O(n²),最好:O(n log n),平均:O(n log n)
空间复杂度O(1)(原地排序)O(1)(原地排序)
适用场景小规模数据或数据几乎已经有序时中等规模数据,尤其是对大规模数据能提高效率
稳定性稳定不稳定

直接插入排序 是一种简单的排序方法,适合小规模数据或者数据已经基本有序的情况。

希尔排序 是对插入排序的改进,通过增大间隔,逐步提高数据的有序性,从而提高排序效率。

下述为插入排序的源码。

#include <stdio.h>//49,38,65,97,76,13,27,49void shellSort(int arr[],int n){int gap,i,j,temp;for(gap = n/2 ; gap > 0  ; gap /= 2){for(i = gap ; i < n ; ++i){temp = arr[i];j = i;while (j >= gap && arr[j - gap] > temp) {arr[j] = arr[j - gap];j -= gap;}arr[j] = temp;}}
}void insertionSort(int arr[],int n){int i,j,key;for(i=1; i<n ;++i){key = arr[i];j = i-1;while(j >= 0 && arr[j] > key ){arr[j+1] = arr[j];j--;}arr[j+1] = key;}
}void printArray(int arr[],int n){for(int i=0 ; i<n ; ++i){printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {49,38,65,97,76,13,27,49};int n = sizeof(arr)/sizeof(arr[0]);printf("原始数组: ");printArray(arr,n);
//    insertionSort(arr,n);shellSort(arr,n);printf("排序后的数组: ");printArray(arr,n);return 0;
}

http://www.ppmy.cn/devtools/161458.html

相关文章

C++栈与队列:数据结构的“单行道”与“流水线

C栈与队列&#xff1a;数据结构的“单行道”与“流水线” 开篇小故事&#xff1a;火车站的两条轨道 想象一个火车站有两条特殊轨道&#xff1a; 轨道A&#xff08;栈&#xff09;&#xff1a;火车只能从同一端进出&#xff0c;最后进入的车厢必须先离开。轨道B&#xff08;队…

动态链接器(九):.init和.init_array

ELF文件中的.init和.init_array段是程序初始化阶段的重要组成部分&#xff0c;用于在main函数执行前完成必要的初始化操作。 1 .init段和.init_array 段 1.1 作用 .init段包含编译器生成的初始化代码&#xff0c;通常由运行时环境&#xff08;如C标准库的启动例程&#xff0…

引入elementUI时报错undefined is not an object (evaluating ‘h.a.prototype‘)

把这两个引入方式都做了 于是报错&#xff1a; 把CDN的删掉就好了。

Spring Boot 中多线程工具类的配置与使用:基于 YAML 配置文件

文章目录 Spring Boot 中多线程工具类的配置与使用&#xff1a;基于 YAML 配置文件1. 为什么需要多线程工具类&#xff1f;2. 实现步骤2.1 添加依赖2.2 配置线程池参数2.3 创建配置类2.4 创建线程池工具类2.5 使用线程池工具类2.6 测试线程池工具类 3. 配置文件的灵活性4. 总结…

【精调】LLaMA-Factory 快速开始1: Meta-Llama-3.1-8B-Instruct

llamafactory-cli train examples/train_lora/llama3_lora_sft.yaml llamafactory-cli chat examples/inference/llama3_lora_sft.yaml llamafactory-cli export examples/merge_lora/llama3_lora_sft.yaml模型下载 git clone https://www.modelscope.cn/LLM-Research/Meta-Lla…

【分布式理论11】分布式协同之分布式事务(一个应用操作多个资源):从刚性事务到柔性事务的演进

文章目录 一. 什么是分布式事务&#xff1f;二. 分布式事务的挑战三. 事务的ACID特性四. CAP理论与BASE理论1. CAP理论1.1. 三大特性1.2. 三者不能兼得 2. BASE理论 五. 分布式事务解决方案1. 两阶段提交&#xff08;2PC&#xff09;2. TCC&#xff08;Try-Confirm-Cancel&…

Ai沟通学习记录三

代理模式 简单的理解可以任务角色扮演。例如&#xff1a;“你是伟大的画家”&#xff0c;帮我构思一个山水花的描述词。 你是个眼科医生&#xff0c;我最近眼干燥&#xff0c;怎么弄。 等等。 举例环节 输入&#xff1a; 如果你是熊。看到一个人&#xff0c;蹲下来捡石头。 你…

Pytorch的F.cross_entropy交叉熵函数

参考笔记&#xff1a;pytorch的F.cross_entropy交叉熵函数和标签平滑函数_怎么给crossentropyloss添加标签平滑-CSDN博客 先来讲下基本的交叉熵cross_entropy&#xff0c;官网如下&#xff1a;torch.nn.functional.cross_entropy — PyTorch 1.12 documentation torch.nn.fun…