当前位置:网站首页>排序1-插入排序与希尔排序
排序1-插入排序与希尔排序
2022-07-28 15:27:00 【世_生】
前言

一、插入排序
直接插入排序是一种简单的插入排序法,把待排序的记录按其关键码值的大小逐个插入到一
个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
简单的来说:上图
当然,图上的方法难免有一些特例
上图:当进行到第四趟插入排序的时候
当然,开始写代码的时候,我们可以先写单趟,假设前n-1已经有序了,我们在来插入最后一个数,
然后再来写多趟,这样就可以简单写出插入排序了。当然,我这样写,是为了写下面介绍的希尔排序。
void InsertSort(int *arr, int n)//这里的n是·数组中元素的个数
{
for (int i = 0; i<n-1; i++)//上图可知道,我们控制外层循环的时候,只要控制小于n-1
{
int end=i;
int tmp=arr[end+1];
while (end >= 0)
{
if (arr[end] > tmp)//比较大小
{
arr[end + 1] = arr[end];//后移
end--;//end--,前移
}
else
{
break;
}
}
arr[end + 1] = tmp;//防止上面说的情况,在循环外插入
}
}
总结:
- 元素越接近有序,插入排序的时间效率就越高
- 时间复杂度为O(N)
- 空间复杂度为O(1)
- 稳定性:稳定
上面插入排序的代码特点是,前后指针相关联的,且从左到右
二、希尔排序
希尔排序:希尔排序又称缩小增量法,先选定一个整数,把待排序文件中所有记录分成个
组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。
简单点说:
- 先预排序—>接近有序
- 直接插入排序
如图:
当数据较大时,我们应该如何控制gap呢?
- 我们可以用数据来控制,先gap=n
- 如何在循环中gap=(gap/3+1),我们以gap/3来慢慢缩小gap的值
- 当gap越小的时候,就越接近有序
为什么是gap=(gap/3+1)而不是gap=(gap/3)呢?
- 举个例子,当gap=6时,如果是gap=(gap/3),那么第一次循环,gap=2,当进行第二次循环的时候,gap=0了,那么进行下面的循环的时候就没法玩了。
- 但是当gap=(gap/3)+1的时候,第一次循环,gap=3,第二次循环,gap=2,第三次循环gap=1,然后再结束,这时候,就进行了预排序后面要进行的插入排序了,排序完成。
- gap=1的时候就相当于插入排序,所以控制gap的大小来控制整个程序是否结束,当然这时候进行插入排序的时候,数组已经接近有序了,所以这时候插入效率很高。
细心的朋友应该发现了,下面代码中的当gap=1时就是插入排序
//希尔排序
void ShellSort(int *arr,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 = arr[end + gap];
while (end >= 0)
{
if (arr[end] > tmp)
{
arr[end + gap] = arr[end];
end -= gap;
}
else
{
break;
}
}
arr[end + gap] = tmp;
}
}
}
这个代码最外围的for循环,要好好看一下,
如图:这是gap=3的时候
总结:
- 希尔排序是对直接插入排序的优化。
- 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
- 希尔排序的时间复杂度不好计算,需要进行推导,推导出来平均时间复杂度: O(N1.3~N2)
- 稳定性:不稳定
总结
通过上面的学习,我们知道希尔排序的关键并不是随机分组后的各自排序,而是将相隔某个“增量”的记录组成一个子序列,实现跳跃式移动,使得排序的效率提高。
边栏推荐
- 使用py,根据日志记录自动生成周报
- Abaqus GUI界面解决中文乱码问题(插件中文乱码也适用)
- 我在上海偶遇数字凤凰#坐标徐汇美罗城
- I can only sell the company after the capital has been "cut off" for two years
- ANSYS二次开发 - MFC界面调用ADPL文件
- Notes on October 22, 2021
- QT packaging
- Qt学习之Qt Designer(设计师)
- HyperMesh运行脚本文件的几种方法
- Deeply understand the fusing configuration of istio traffic management
猜你喜欢

学会使用MySQL的Explain执行计划,SQL性能调优从此不再困难

HyperMesh自动保存(增强版)插件使用说明

mysql查询 limit 1000,10 和limit 10 速度一样快吗?如果我要分页,我该怎么办?

Zhengda cup hacker marathon data analysis competition

I can only sell the company after the capital has been "cut off" for two years

Why do most people who learn programming go to Shenzhen and Beijing?

Rosen's QT journey 101 models and views in QT quick

I'll show you a little chat! Summary of single merchant function modules

I came across Digital Phoenix coordinate Xuhui Meiluo city in Shanghai

flashfxp 530 User cannot log in. ftp
随机推荐
php关于数据量大导出数据或者遍历数据导致内存溢出超时等问题
1. Simple command line connection to database
Roson的Qt之旅#101 Qt Quick中的模型和视图
PHP gets the applet code, and the applet jumps with parameters
Brief tutorial for soft exam system architecture designer | software debugging
视频号找到金钥匙,抖音模仿后来人
Numpy ndarray learning < II > miscellaneous records
Automatically pack compressed backup download and delete bat script commands
STM32F103C8T6 + 0.96“ I2C OLED显示3D_Cube
Wei Jianjun couldn't catch up with Li Shufu by riding a BMW
解决电脑恶意广告弹窗的思路
Wechat official account to obtain material list
500million users, four years earlier than wechat... This app, which has been in operation for 15 years, will be permanently discontinued
Writing of factorial
Early in the morning, pay Bora SMS to say that you won the "prize"? Dealing with server mining virus - kthreaddi
Temperature measurement and imaging accuracy of ifd-x micro infrared imager (module)
Solve the width overflow of rich text pictures such as uniapp
QT packaging
带你来浅聊一下!单商户功能模块汇总
KubeEdge发布云原生边缘计算威胁模型及安全防护技术白皮书