排序算法

来源:互联网 发布:python下载安装 编辑:程序博客网 时间:2024/06/04 19:32

前言


老师讲了几次排序算法,选择排序,冒泡排序和插入排序。既然都叫排序,那他们又有什么联系和区别呢。现在就来梳理一下。

选择排序和冒泡排序

选择排序

这里写图片描述

老师画的这个图非常形象,选择排序,简而言之就是假设第一个数最大,后面的2到n个数依次跟第一个数比较比它大就交换位置,这次循环完就找到了最大的数,所以第一个数就不用管了。

所以就像这个三角形,角朝左,直角边的长度依次减少,代表内循环的次数依次减少。

冒泡排序

这里写图片描述

冒泡排序和选择排序的不同之处就在于它是相邻的两个数两两比较,大的冒泡,即大的往右扔,所以就有了三角形的角朝右。

插入排序

定义


每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
即,
已经有一个有序序列,然后把数值插到这个有序列中。

这里写图片描述

分类

(1)直接插入排序

把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。
这里写图片描述
直接插入排序和冒泡排序有点相似, 都是动态的两两比较。但不同点在于,冒泡排序是两两比较完就会交换,而直接插入是两两比较,如果符合条件就插到这个数的前面,已经和它比较过的这些数往后移动一位。总而言之,直接插入没有一直交换位置。

(2)折半插入排序
将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较。
个人理解:折半插入就是直接插入的一个简便算法,本质上没有区别。直接插入是拿一个数与有序数列的所有值从右开始一个个比较,二折半插入则是把有序数列一分为二,先判断要插入的这个数在哪个区间,然后再把小区间一份为二,知道找到比它小的 数为止。 这个有点像数学中的二分法求零点的方法。就是个简便算法。

(3)希尔排序法
希尔排序法又称缩小增量法。

先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。
这里写图片描述

操作方法:
1. 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
2. 按增量序列个数k,对序列进行k 趟排序;
3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。

总结


条条大路通罗马,殊途同归。这些算法总有千般不同但宗旨都是为了排序,每种算法都可以做到给数值等排序,但区别就在于路上的时间用的时间和消耗是不同。这几种算法的空间复杂度和时间复杂度是不同,而且这些算法是基本的,遇到数据量大的时候,比如移动业务话费单据,银行单据,淘宝订单数据等,需要更加高效的算法。

这里写图片描述

0 0
原创粉丝点击