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

news/2025/2/24 22:51:53/

直接插入排序(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/news/1574710.html

相关文章

力扣——杨辉三角

题目链接&#xff1a; 链接 题目描述&#xff1a; 思路&#xff1a; 直接找规律&#xff0c;按照数学的思路来 每一行的列最大索引 < 行索引 实现代码&#xff1a; class Solution {public List<List<Integer>> generate(int numRows) {List<List<In…

一、Spring框架系统化学习路径

系统化的Spring框架学习路径 第1阶段&#xff1a;基础知识准备 Java基础 核心概念&#xff1a;面向对象、异常处理、集合框架、多线程等。JVM基础&#xff1a;内存模型、垃圾回收机制。 Maven或Gradle Maven&#xff1a;创建项目、依赖管理、生命周期。Gradle&#xff1a;基本…

【GPU驱动】OpenGLES图形管线渲染机制

OpenGLES图形管线渲染机制 OpenGL/ES 的渲染管线也是一个典型的图形流水线&#xff08;Graphics Pipeline&#xff09;&#xff0c;包括多个阶段&#xff0c;每个阶段都负责对图形数据进行处理。管线的核心目标是将图形数据转换为最终的图像&#xff0c;这些图像可以显示在屏幕…

百度首页上线 DeepSeek 入口,免费使用

大家好&#xff0c;我是小悟。 百度首页正式上线了 DeepSeek 入口&#xff0c;这一重磅消息瞬间在技术圈掀起了惊涛骇浪&#xff0c;各大平台都被刷爆了屏。 百度这次可太给力了&#xff0c;PC 端开放仅 1 小时&#xff0c;就有超千万人涌入体验。这速度&#xff0c;简直比火…

黑马点评 面试话术

MybatisPlus session技术会把jsessionid自动写到cookie里 ThreadLocal保证线程安全 用springmvc的自定义拦截器把登出用户 查看详情 获取当前用户并且返回 上传操作 登录查看详情 以下是不拦截的路径 在tomcat负载均衡时 如果不使用redis 直接用相互拷贝 1 浪费空间 2 如果此时…

开放表格式和对象存储架构指南

比较 Apache Iceberg、Delta Lake 和 Apache Hudi&#xff0c;并了解如何为您的数据湖仓一体选择合适的开放表格式。开放表格式和对象存储正在重新定义组织构建其数据系统的方式&#xff0c;为可扩展、高效且面向未来的数据湖仓一体奠定了基础。通过利用对象存储的独特优势&…

HTML 中的 Canvas 样式设置全解

在 HTML5 中&#xff0c;<canvas> 元素提供了一个强大的绘图接口&#xff0c;允许开发者通过 JavaScript 实现各种图形和动画效果。为了充分利用 <canvas> 的功能&#xff0c;理解其样式设置是至关重要的。本文将详细介绍如何在 HTML 中设置 <canvas> 的各种…

第11篇:Provide/Inject(跨组件通信)

目标&#xff1a;掌握跨层级组件通信的核心方式 1. 基础用法 <!-- 祖先组件 Ancestor.vue --> <script setup> import { provide } from vue // 提供静态数据 provide(theme, dark) // 提供响应式数据 const count ref(0) provide(count, count) &…