【排序】直接插入排序和希尔排序

news/2025/2/22 14:44:41/

目录

一、排序思想

1、直接插入排序

2、希尔排序

二、代码实现

三、性能比较

四、排序总结

1、直接插入排序

2、希尔排序


一、排序思想

1、直接插入排序

基本思想:把待排序的序列选取一个整数逐个插入到已经排好的有序序列中,直到所有整数都插入到这个有序序列中,得到一个新的有序序列。

2、希尔排序

基本思想:在直接插入排序的基础上进行了优化,选取一个整数gap,把每个距离为gap的数分为一组,并对每一组内的数进行预排序,得到接近有序的序列。更改gap,直到gap==1时,得到一个新的有序序列。

二、代码实现

//直接插入排序
void InsertSort(int* a, int n)
{//先走单趟 再走整体//[0,end]有序,把end+1位置的值插入 保持有序for (int i = 0; i < n - 1; i++){int end=i;int tmp = a[end + 1];while (end >= 0){//排升序if (tmp < a[end]){a[end + 1] = a[end];end--;}else{//只要tmp>=a[end]就跳出循环  break;}}a[end + 1] = tmp;}}
//希尔排序
void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){gap = gap / 3+1;for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){//排升序if (tmp < a[end]){a[end + gap] = a[end];end-=gap;}else//只要tmp>=a[end]就跳出循环break;}a[end + gap] = tmp;}}}

三、性能比较

//随机生成100000个数,插入到在堆上开辟的数组中,并对该数组进行排序
//测试两个排序所用时间
void TestOP()
{srand(time(0));const int N = 100000;int* a1 = (int*)malloc(sizeof(int) * N);int* a2 = (int*)malloc(sizeof(int) * N);//memset(a1, 0, sizeof(int) * N);for (int i = 0; i < N; i++){a1[i] = rand();a2[i] = a1[i];}int begin1 = clock();InsertSort(a1, N);int end1 = clock();int begin2 = clock();ShellSort(a2, N);int end2 = clock();printf("InsertSort:%d\n", end1 - begin1);printf("ShellSort:%d\n", end2 - begin2);free(a1);free(a2);
}
int main()
{TestOP();return 0;
}//运行结果
InsertSort:3700
ShellSort:16

四、排序总结

1、直接插入排序

<1>、元素集合越接近有序,直接插入排序的时间效率就越高,最坏情况是逆序

<2>、时间复杂度:O(n^2)

<3>、空间复杂度:O(1)

<4>、稳定性:它是一种稳定的排序算法

2、希尔排序

<1>、希尔排序是对直接插入排序的进一步优化,当gap>1时都是进行预排序,目的是让数组更有序,当gap==1时,数组已经接近有序,整体达到对直接插入排序的优化。

<2>、时间复杂度:O(n^1.3)

<3>、空间复杂度:O(1)

<4>、稳定性:它是一种不稳定的排序算法


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

相关文章

com.intellij.openapi.application.ApplicationListener使用

一般监听期通过如下代码生效 <applicationListeners> <!-- <listener class"com.itheima.taunt.MyApplicationListener"--> <!-- topic"com.intellij.openapi.application.ApplicationListener"…

异步I/O操作函数aio_xxx函数

文章目录 前言异步IO示例带回调的异步IO使用aio_read的echo服务总结 前言 POXSIX提供了用于异步I/O的"aio_xxx"函数集。 名称功能aio_read异步readaio_write异步writeaio_fsync异步fsyncaio_error获取错误状态aio_return获取返回值aio_cancel请求取消aio_suspend请…

Hdoop学习笔记(HDP)-Part.19 安装Kafka

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

网站有必要使用SSL证书吗

随着互联网的快速发展&#xff0c;网络安全问题也变得日益突出&#xff0c;SSL证书的作用日益凸显。 什么是SSL证书&#xff1f; SSL证书&#xff08;Secure Sockets Layer Certificate&#xff09;&#xff0c;也称为TLS证书&#xff08;Transport Layer Security Certifica…

【C/C++笔试练习】公有派生、构造函数内不执行多态、抽象类和纯虚函数、多态中的缺省值、虚函数的描述、纯虚函数的声明、查找输入整数二进制中1的个数、手套

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;公有派生&#xff08;2&#xff09;构造函数内不执行多态&#xff08;3&#xff09;抽象类和纯虚函数&#xff08;4&#xff09;多态中的缺省值&#xff08;5&#xff09;程序分析&#xff08;6&#xff09;重载和隐藏&a…

3.3 路由器的远程配置

实验3.3 路由器的远程配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施&#xff08;一&#xff09;、配置通过Telnet登录系统1.RA的基本配置2.RB的基本配置3.在RA上配置Telnet用户登录界面 &#xff08;二&#xff09;、配置通过STelnet登录系统1.RA的基本配…

【从删库到跑路 | MySQL总结篇】事务详细介绍

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、事务…

supervisor管理启动重启,Java,Go程序Demo

简介 Supervisor 是一款 Python 开发的进程管理系统&#xff0c;允许用户监视和控制 Linux 上的进程&#xff0c;能将一个普通命令行进程变为后台守护进程&#xff0c;异常退出时能自动重启 1、安装 yum -y install supervisor2、配置默认配置文件 echo_supervisord_conf &g…