排序算法学习--内部排序(一)
1. 什么是排序?
排序是把无序的数据整理为有序的数据。
2. 排序种类划分?
根据排序中,数据的移动方式划分为:直接移动和逻辑移动两种。
根据排序排序中所使用的存储器划分为:内部排序和外部排序。
内部排序就是数据操作只需要借助内存来完成。
外部排序就是需要借助外部存储设备,如硬盘,u盘,软盘等等。适用于数据量庞大的场景。
3.排序算法优劣划分依据?
(1)是否稳定。也就是考虑在存在数据相等时,排序后是否会引起相等数据位置的不确定。可以确定相对位置的就是稳定排序。反之,就是不稳定排序。
(2)时间复杂度。用于衡量程序运行时间的函数。
(3)空间复杂度。用于衡量排序所用空间的函数。
4.常用的内部排序算法有哪些?
(1)冒泡排序。
冒泡排序如同气泡,自下而上浮出水面。
原理:将每一个元素和其他元素相比较,如果这个元素小于其他元素,就进行调换位置。因此需要 (n-1)+(n-2)+...+(n-(n-1))=1+2+3+...+(n-1)=(n-1)n/2
因此时间复杂度为O(n^2),并且是稳定排序。排序过程只需要一个额外的空间。
另外,冒泡排序在其中一个元素没有发生交换位置时,就已经是一个有序的数据。循环可以提前结束。是一个优化的方案。
(2)选择排序
选择排序是遍历数据将每个最小的元素变换位置,而达到最终的有序。有点儿类似于冒泡排序,但是选择排序不会进行频繁的位置交换,只会从第一个元素开始,查找最小的元素,次小的等等,最多只会有n-1次交换位置。
从执行次数来讲和冒泡排序一样。时间复杂度也是O(n^2)。
注意:选择排序不是稳定排序。因为如果有和位置0相等的其他元素,交换为之后,相对顺序会发生改变,因此不是稳定的。
空间上只需要1个额外空间。
(3)插入排序
就是依次取一个元素,直至取完,将每一个元素插入,直至最后一个元素。
需要的执行次数为:1+2+...+(n-1)= n(n-1)/2,时间复杂度为O(n^2),并且是稳定排序,需要空间为一个额外的空间。
会进行大量的数据移动,建议在链表上使用。
(4)希尔排序
排序原理:分组拆(注意:相反的可以分组合,另一种排序算法)
就是先分成几个区块,再减小间距,直至间距为1,进行最后依次排序,完成!!!
时间复杂度为O(n^3/2),稳定排序,只需要一个额外的空间。
(5)合并排序
由小集合到大集合的过程,就相当于是分多个队伍,各自排好自己的顺序,再合到一起。
时间复杂度为O(n*logn),稳定排序,需要一个与文件大小相同的空间。
(6)快速排序法
又叫做分割交换排序法,是目前公认最佳的排序法。
原理:固定一个基准点,确定一个基准点,使左边的数据都小于右边的数据,各自再进行排序。
时间复杂度为O(nlog2N),不是稳定排序法,因为会进行位置交换。空间复杂度最差为O(n)
,最佳情况为O(log2N)
(7)堆积排序法
运用二叉树的技巧,树根大于等于左右子树,将数据转换为堆积树。然后依次从最大的树根处移除数据。
时间复杂度为O(nlogN),不是稳定排序,需要一个额外的存储空间。