一、内部排序算法的比较
1.内部排序主要有插入排序,交换排序,选择排序,归并排序和基数排序。
其中插入排序的基本思想在于每次将一个待排序的记录按其关键字的大小插入到前面已经排好的序列中。实现算法主要有直接插入排序算法,折半插入算法和希尔排序算法。直接插入排序算法思路三步走,第一步先查找要插入的位置,第二步将插入位置后的数据 后移,第三步将要插入的记录插入。折半插入排序算法使用这半查找的方式来寻找要插入的位置,然后统一将插入位置后面的记录向后移动,然后将数据插入有序表中。希尔排序算法又被称为缩小增量排序,基本思想是将有序表分为若干个有增量的特殊子表,分别对其进行直接插入排序,当整个表中的元素已经基本有序时,再对全体记录进行一次直接插入排序,其性能好坏与增量序列函数密切相关。点击打开链接
交换排序的基本思想是根据序列中两个关键字的比较结果来交换着两个记录的位置。实现算法主要有冒泡排序和快速排序。冒泡排序算法的基本思想是在带排序表中从后往前或者从前往后比较两个相邻记录的关键字大小,若为逆序则交换他们,直到序列比较完为止,称为一趟冒泡,最坏情况下共需要n-1趟冒泡。快速排序的基本思想是基于分治法的,在待排序表中选取一个pivot作为基准,将带排序表分为两部分,pivot之前的子表中的关键字均小于pivot,pivot之后的子表中关键字均大于pivot关键字,这样就完成一次快排,然后对两个子表调用同样排序操作,直到待排序表有序为止。点击打开链接
选择排序的基本思想是每一次(假设第i次)都从带排序表中选出关键字最小的元素作为带排序表的第i个元素。直到第n-1趟结束。实现算法主要有简单选择排序和堆排序。
简答选择排序第i趟从L[i......n]中选择出最小的元素,然后和第i个位置的元素交换位置。每一趟都可以确定一个元素的最终位置。堆排序算法是一种树形选择排序算法,利用完全二叉树中双亲结点和孩子结点之间的内在关系选择关键字最小或者最大的元素。点击打开链接
归并排序算法是将两个或者两个以上的有序表组合成一个新的有序表。而基数排序算法是基于多关键字排序思想,借助分配和采集两种操作对单逻辑关键字进行排序。点击打开链接
2、时间复杂度和空间复杂度以及稳定性分析:
时间复杂度 空间复杂度 是否稳定
最好情况下 最坏情况下 平均情况下
插入排序
直接插入排序 O(n) O(n2) O(n2) O(1) 是
折半插入排序 O(log2(n)) O(n2) O(n) O(1) 是
希尔排序 O(1) 否
交换排序
冒泡排序 O(n) O(n2) O(n2) O(1) 否
快速排序 O(nlog2(n)) O(nlog2(n)) O(n2) O(log2(n)) 否
选择排序
简单选择排序 O(n2) O(n2) O(n2) O(1) 否
堆排序 O(nlog2(n)) O(nlog2(n)) O(nlog2(n)) O(1) 否
2路归并排序 O(nlog2(n)) O(nlog2(n)) O(nlog2(n)) O(n) 是
基数排序 O(d(n+r)) O(d(n+r)) O(d(n+r)) O(r) 是
则
时间复杂度为O(n2)的有:直接插入排序,冒泡排序,快速排序,简单选择排序(但在最好情况下直接插入排序和冒泡排序时间复杂度为O(n),快速排序在最好情况下可以 达到O(nlog2(n)))。
时间复杂度为O(nlog2(n))的有: 堆排序和2路归并排序
时间复杂度为O(d(n+r))的是基数排序
空间复杂度为O(1)的有:直接插入排序,希尔排序,冒泡排序,简单选择排序和堆排序。
空间复杂度为O(log2(n))的是:快速排序
空间复杂度为O(n)的是:2路归并排序
空间复杂度为O(r)的是:基数排序
稳定算法有:直接插入排序,冒泡排序,2路归并排序和基数排序
不稳定算法有:简单选择排序,希尔排序,快速排序和堆排序。
二、内部排序算法的应用
1、若n较小:则可采用直接插入排序或者简单选择排序。由于直接插入排序所需要的记录移动操作比简单选择操作多,因而当记录本身信息量较大时候,用简单选择排序较好。
2、若文件的初试状态基本有序时,用直接插入排序或者冒泡排序较好。
3、若n较大时,应采用时间复杂度为O(nlog2(n))的排序方法,如快速排序,堆排序或者归并排序。快速排序被认可为目前基于比较的内部排序算法中最好的方法。
4、若n很大,记录的关键字位数较小并且可以分解时候,用基数排序最好。
5、当记录本身信息量较大,为避免耗费大量的时间移动记录,可以用链表作为存储结构。