前面介绍了七大算法的思想与实现步骤,下面来作一个归总。git
排序方法 | 平均复杂度 | 最坏复杂度 | 最好复杂度 | 辅助空间 | 稳定性 | |
---|---|---|---|---|---|---|
直接选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 稳定 | |
冒泡排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 稳定 | |
直接插入排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 稳定 | |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 | |
快速排序 | O(nlogn) | O(n^2) | O(nlogn) | O(1) | 不稳定 | |
希尔排序 | O(nlogn)~O(n^2) | O(n^1.3) | O(n^2) | O(logn)~O(n) | 不稳定 | |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
直接选择排序,总体思想是将数据分红两个区域,有序区
与无序区
。排序的时候是每次从无序区
中选择出最小的数,而后插入到有序区
中的最末尾,从而造成更大的有序区
。直到无序区
中的数为零,结束排序。github
假设排序数组为a[0...n-1];算法
有序区
中的个数为0,令i = 0
。从无序区
中选择最小的数,加入到有序区a[i]
中。使得有序区
为a[0..i]
,无序区
为a[i...n-1]
i++
,而后继续前面的步骤,直到 i = n-1
为止。使得所有数都在有序区
中。冒泡排序主要是相邻的两个数两两进行比较,拿从小到大说明,进行冒泡排序后会将大的数沉
到底部,将小得数浮
到顶部。因此冒泡说法由此得名。数组
以从小到大为例,排序数组大小为n
。数据结构
N = 0
趟排序开始都从a[0]
开始与其下面的相邻的数进行比较,若是大于相邻的数则交换他们的位置。n-1
次后,第N = 0
趟排序结束,最大的数就在数组的a[n-1]
处。N = n-1
,排序结束。直接插入排序的基本思想是:将须要排序的关键数与前面已经排好序的数据从后往前进行比较,使其插入到合适的位置
。spa
排序数组为a[0...n]
code
a[0]
做为起始数据,从a[1]
开始做为关键字向前进行比较,若小于前面所遇到的比较数,则交换两个比较数的位置,不然直接进行下一个关键字的比较。a[n]
做为关键字进行比较。比较完之后则排序结束。归并排序是一个效率相对较高的排序算法,它采用的是分治的思想
,将待排序的序列分红若干组,保证每组都有序,而后再进行合并排序,最终使整个序列有序。排序
分治思想
将其划分红若干组,使其有序,其中可采用递归进行划分。2
的步骤,直到全部数据比较完毕,或者将还有剩余数未比较的有序数据直接按原有的顺序加入到辅助数组中,最后将已经排好序的辅助数组加入到原有数组的相应位置。2
、3
步骤,直到全部的左右划分归并完毕。快速排序的主要思想是:将一个待排序序列分红两个部分,以其中的一个数据做为分界线,其中一部分小于这个分界线的数据,另外一部分大于这个分界线的数据。由于采用递归的思想,再对这两个序列进行快速排序,直到因此的数据都是有序的
。递归
假设待排序的数组为a[0...n-1]
ip
a[i]
(i = 0
) 做为关键数,即快速排序的分界数。先从数组的后面开始即初值j = n-1
,逐个向前进行遍历与选的的关键数进行比较(j--
),若大于等于关键数则继续遍历,不然将其与关键数所在的位置进行交换,并中止遍历且i++
记录此时的i
、j
。i
个位置开始向后进行遍历,逐个与关键数进行比较(i++
),若小于等于关键数则继续遍历,不然将其与关键数所在的位置进行交换,并中止遍历且j--
记录此时的i
、j
。i==j
就结束本次快速排序。1
即此时全部数据有序。希尔排序是记录增量来进行分组,再对分组内部进行直接插入排序,随着增量的不断减少,直到增量减少到1
时,即每一个分组中的数据量为1
,此时排序结束。
设待排序的数组为a[0...n-1]
d=n/2
。从a[0]~a[d-1]
将数组中数据之间的间隔为增量数d
的倍数归为相同组。d=d/2
,重复上面的步骤,直到d=1
为止。堆排序是采用树的形式的数据结构来进行排序的,其中每个堆都是彻底二叉树。堆排序分为大根堆与小根堆,大根堆(小根堆)表示在彻底二叉树中,所用的非叶子节点都大于等于(小于等于)他们左右子节点(存在)
。因此堆的顶点不是最大数就是最小数。这样的话咱们就能够借助这种性质,每次都取出大根堆(小根堆)的顶点数,造成有序序列
。
N
(N=n)个节点互换位置,即a[N-1]
。N--
,但此时要生成的数的范围为a[0...N-1]
。2
、3
,直到N=1
,即a[0]
,排序结束。若有不足之处欢迎指出,所有代码已经放到github上,有须要的能够下载。
github地址:https://github.com/idisfkj/Ar...