【数据结构】一文带你全面了解排序(上)——直接插入排序、希尔排序、选择排序、堆排序

2024-02-27 1449阅读

温馨提示:这篇文章已超过461天没有更新,请注意相关的内容是否还可用!

目录

一、排序的概念及其运用

1.1 排序的概念

1.2 常见的算法排序

二、常见排序算法的实现

2.1 插入排序

2.1.1 思想

2.1.2 直接插入排序

2.1.3 希尔排序(缩小增量排序) 

2.2 选择排序

2.2.1 基本思想

2.2.2 直接选择排序

2.2.3 堆排序 


没有坚持的努力实质上并没有太大的意义!


一、排序的概念及其运用

1.1 排序的概念

排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j] ,且r[i]在r[j] 之前,而在排序后的序列中, r[i] 仍在 r[j] 之前,则称这种排 序算法是稳定的;否则称为不稳定的。

 稳定的:直接插入排序、冒泡排序、归并排序

不稳定的:希尔排序、选择排序、堆排序、快速排序

内部排序 :数据元素全部放在内存中的排序。 外部排序 :数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

1G = 1024MB 1024MB = 1024*1024KB  1024*1024KB = 1024 * 1024 * 1024byte(10亿)

(1) 直接插入排序、希尔排序、直接选择排序、桶排序、冒泡排序、快速排序、归并排序都是内部排序。 归并排序可以外部排序 

(2)内部排序:数据在内存中,速度快、下标可以随机访问(因为是数组);外部排序:数据在磁盘、速度慢、串行访问(文件)、数据量很大

 给一个10亿(4G内存)个整数的文件,但是只给1G的运行内存,请对文件的10亿个数据进行排序?   

思想:数据量大加载不到内存,想办法控制两个有序文件归并成一个更大的有序文件

思路:首先分成4等份,分别读到内存排序(这里不能使用归并排序,因为需要额外空间),排完序,写回到磁盘小文件,然再磁盘中,进行归并

1.2 常见的算法排序

【数据结构】一文带你全面了解排序(上)——直接插入排序、希尔排序、选择排序、堆排序

 冒泡排序= 0) { if (a[end]

第二层循环的n-gap也是最后一个元素的下标,但是一共有gap组,所以是n-gap

预排序:大的数据更快的来到后面,更小的数据更快的来到前面 ,使其接近有序

首先分组,取gap = 3,然后取第一个元素,第四个元素,第七个元素……(直到这个元素的下标大于数组的最后一个下标)分为一组;取第二个元素,第五个元素……分为一组;取第三个元素,第六个元素……分为一组;【gap是多少,就分为多少组】分完组之后,进行排序,分别使用直接插入排序对这gap组数据进行排序

如果gap越小,越接近有序;gap越大,大的数据可以更快的到最后,小的数据可以更快的到前面,但是它越不接近有序。

时间复杂度:O(N*log以3为底N的对数),平均是O(N^1.3)

看预排序部分,如果gap很大,那么最里面的循环,可以忽略不计,就是O(N),

如果gap很小,数据已经非常接近有序了,那么就也是O(N)。

看最外面的循环,N/3/3/3/3/3……/3=1 即3的x次方等于N,即log以3为底N的对数

稳定性:不稳定

2.2 选择排序

2.2.1 基本思想

  每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

2.2.2 直接选择排序

遍历找出最大和最小的数的位置, 放在数组的两头位置【注意:这里是交换元素,否则就会覆盖数据】,然后遍历找出次小和次大的数字,放在数组的次头位置……一直到全数据元素排完。

代码展示:【优化后的】没有优化的是一次找一个元素

void SelectSort(int* a, int n)
{
	int left = 0;
	int right = n - 1;
	while (left  
 
 

注意:(第一次进行最小值进行交换的时候)如果left_0是最大值,最大值此时换到mini_5的位置,/maxi最大位置本来是0,但是此时最大值被换到5的位置,那么此时最小值会被换到最后

1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用 2. 时间复杂度: O(N^2) 在最好的情况下、最差的情况下时间复杂度都为O(N),因为无论有序、无序都要进行遍历找出最大和最小的元素下标 3. 空间复杂度: O(1) 4. 稳定性:不稳定

直接选择排序是优于冒泡排序的,但是在数据有序或者接近有序的情况下,冒泡排序是优于直接选择排序的。

2.2.3 堆排序

详细内容见:堆排序链接 

堆排序 (Heapsort) 是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。 1. 堆排序使用堆来选数,效率就高了很多。 2. 时间复杂度: O(N*logN) 3. 空间复杂度: O(1) 4. 稳定性:不稳定

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]