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

news/2025/2/23 23:14:01

直接插入排序(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,49

void 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.niftyadmin.cn/n/5863853.html

相关文章

【20250221更新】WebStorm2024.3.3版本安装+使用方法

1、官网下载正版WebStorm&#xff0c;链接如下 Thank you for downloading WebStorm! 2、获取使用教程&#xff0c;给博主留言【压缩包有密码&#xff0c;见下面】 通过百度网盘分享的文件&#xff1a;【2025022… 链接:https://pan.baidu.com/s/1UMMEDKbRwlGcffAhOlwR5g?pw…

华为guass在dbever和springboot配置操作

下面记录华为guass在dbever和springboot配置操作&#xff0c;以备忘。 1、安装dbeaver-ce-23.2.0-x86_64-setup.exe和驱动程序 Download | DBeaver Community 2、配置高斯数据库驱动 3、新建数据库连接 4、操作指引 opengauss官方文档 https://docs-opengauss.osinfra.cn/zh…

商业航天级微控制器单元(MCU)技术特征分析

在商业航天及特种工业控制领域&#xff0c;微控制器单元&#xff08;MCU&#xff09;的抗辐射性能与系统可靠性直接关系到设备在极端环境下的运行效能。国科安芯AS32S601系列MCU基于自主RISC-V架构&#xff0c;其180MHz(AS32S601)的工作频率与抗辐射加固设计&#xff0c;为航天…

C++跨平台开发:策略与实践在软件开发领域

在软件开发领域&#xff0c;跨平台能力意味着一个应用程序可以在不同的操作系统上运行&#xff0c;无需针对每个平台单独编写代码。C作为一种强大的编程语言&#xff0c;因其高效性和灵活性&#xff0c;在跨平台开发领域有着广泛的应用。本文将探讨C跨平台开发的关键策略与实践…

【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致

业务场景 发布信息&#xff0c;更新到数据库MySQLCOS操作&#xff0c;更新JSON文件 不过可能存在幂等性和数据一致性的问题。 // 批量存MySQL entityPublishService.saveOrUpdateBatch(entityPublishList); // 遍历批量存COS对象存储searchEntitys.forEach(req -> {//删除…

国产编辑器EverEdit - 在编辑器中对文本进行排序

1 排序 1.1 应用场景 某些场景下用户需要对文本进行排序&#xff0c;比如&#xff1a;用户正在编辑函数列表&#xff0c;对函数列表按名称按字母A-Z排序。 1.2 使用方法 1.2.1 对选中文本进行排序 在编辑器中选中要排序的文本。选择主菜单工具 -> 排序 -> 升序排序 如…

Java数据结构_一篇文章搞定java对象的比较_7

1. PriorityQueue中插入对象 上篇文章研究了优先级队列&#xff0c;优先级队列在插入元素中&#xff0c;要求插入的元素不能是null或者元素之间必须要能够进行比较&#xff0c;为了简单起见&#xff0c;上篇文章只是插入了Integer类型&#xff0c;那优先级队列中是否能插入自定…

机器学习面试八股文——决战金三银四

大家好&#xff0c;这里是好评笔记&#xff0c;公主 号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本笔记的任务是解读机器学习实践/面试过程中可能会用到的知识点&#xff0c;内容通俗易懂&#xff0c;入门、实习和校招轻松搞定。 公主号合集地址 点击进入优惠地…