数据结构篇--排序算法

2021-04-08 19:26

阅读:687

标签:占用   插入排序   mamicode   idt   列表   存储空间   基数排序   loading   存储   

一  排序算法的分类

技术图片

二  时间复杂度和空间复杂度

1.时间复杂度

1.1 时间复杂度的计算方式

1).用常数1代替运行时间中所有的加法常数

2)修改后的运行次数函数中,只保留最高阶项

3)去除最高阶项的系数

1.2 常用算法的时间复杂度

技术图片

 

这个需要牢记

2.空间复杂度

空间复杂度是一个算法在运行时临时占用存储空间大小的量度。

例如快排、归并排序、基数排序都属于拿空间换时间的典型。

 

 

三 插入排序

3.1 直接插入排序

字面意思,例如有数组    int[] arr = {1,8,2,45,7,5,9};需要从小到大进行排序

从arr[1]开始,首先需要定义一个变量temp用于存储arr[1]的数值,8大于1,不动,将arr[1]的值赋给arr[1],此循环结束,

然后是arr[2],temp=2,2小于8,将8的数值赋给arr[2],此时是 {1,8,8,45,7,5,9},再往前比较,2

依次进行。

下面是代码。

 

技术图片

 

 

 3.2  希尔排序

  希尔排序是对直接插入排序的改进,最基本的理念在于,直接插入排序中,如果需要前移的次数太多,就会对效率产生很大的影响,那么通过对原数组规律得分块,再对每个块进行插入排序,就会快很多。

  简而言之,底层还是插入排序,只不过在上面加了一层gap的循环。

  实质上还是在该数组里进行排序,理解了插入排序之后就不难理解了。

 

  代码

技术图片

 

 

 

 

四 选择排序

4.1 简单选择排序  

  基本思想是:第一次从 arr[0]~arr[n-1]中选取最小值, 与 arr[0]交换,第二次从arr[1]~arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]~arr[n-1]中选取最小值,与 arr[2] 交换,…,第 i 次从arr[i-1]~arr[n-1]中选取最小值,与arr[i-1]交换,…, 第 n-1 次从arr[n-2]~arr[n-1]中选取最小值,与 arr[n-2]交换,总共通过 n-1 次,得到一个按排序码从小到大排列的有序序列。

代码如下

  技术图片

4.2 堆排序

  堆排序,对我而言最大的特点就是 它是二叉树,我总结了一下网上的结论,堆排序本质上也是个数组,对于一个节点 i,它的父节点为 (i-1)/2,两个子节点为2*i+1 和 2*i+2,对此,只要给定待排序的数组,就可以通过过的一个堆排序,如下代码

技术图片

 

 

其中的swap方法就是交换两个节点的数值,代码如下

技术图片

但堆排序获得的数组并不是一个从大到小的有序数组,所以需要下一步,也就是取堆排序的第一个数(最大值或者最小值),然后对剩下的再做一次堆排序,再取第一个数,循环往复,如下

技术图片技术图片

这一部分的代码参照 https://blog.csdn.net/u010452388/article/details/81283998

 

五  交换排序

5.1 简单交换排序/冒泡排序

通过一个大循环和一个小循环,每次小循环会冒泡出一个当前循环列表里的最大值或者最小值

代码如下

  技术图片

 

5.2  快速排序

  参照https://blog.csdn.net/MoreWindows/article/details/6684558

  该方法的基本思想是:

    1.先从数列中取出一个数作为基准数。

    2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

    3.再对左右区间重复第二步,直到各区间只有一个数。

  

 技术图片技术图片

 

 

六 归并排序 和 基数排序

  归并排序 :是利用归并的思想(将问题分解为一些小问题然后递归求解)实现的排序方法

  基数排序:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。 这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

 

  

 

数据结构篇--排序算法

标签:占用   插入排序   mamicode   idt   列表   存储空间   基数排序   loading   存储   

原文地址:https://www.cnblogs.com/chenlun127/p/13377434.html


评论


亲,登录后才可以留言!