排序(Sort):排序是将各元素按关键字递增或递减顺序重新排列。排序算法分为内部排序(数据都在内存中)和外部排序(数据太多,无法全部放入内存)。
排序算法的评价指标:时间复杂度、空间复杂度、算法的稳定性。
算法的稳定性:关键字相同的元素在排序之后相对位置是否会发生改变。
10.1插入排序
插入排序的算法思想:每次将一个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。插入排序分为直接插入排序和折半插入排序。直接插入排序是顺序查找找到插入的位置,适用于顺序表、链表。折半插入排序是折半查找找到应插入的位置,仅适用于顺序表。
算法效率分析:
空间复杂度: 0(1)
最好时间复杂度(原本有序) : O(n)
最坏时间复杂度(原本逆序) : O(n的2次方)
平均时间复杂度( O(n的2次方)
算法稳定性:稳定
10.2希尔排序
算法思想:适用于顺序表。
算法效率分析:
空间复杂度: 0(1)
时间复杂度:未知,但优于直接插入排序
算法稳定性:不稳定
10.3冒泡排序
冒泡排序算法思想:从后往前或从前往后两两比较相邻元素的值,若为逆序则交换它们,直到序列比较完,称这样过程为“一趟”冒泡排序。最多只需要n-1趟排序。每一趟排序都可以使一个元素的移动到最终位置,已经确定最终位置的元素在之后的处理中无需再对比。如果某一趟排序过程中未发生交换则算法可提前结束。适用于顺序表和链表。
算法性能分析:
空间复杂度O(1)
最好时间复杂度(有序)O(n)
最坏时间复杂度(逆序)O(n的平方)
平均时间复杂度O(n的平方)
稳定性:稳定。
10.4快速排序
算法思想:
算法性能分析:
最好空间复杂度O(n)
最坏空间复杂度O(logn)
最好时间复杂度O(n的平方)每次划分很平均
最坏时间复杂度O(nlogn) 原本逆或正序
平均时间复杂度O(nlogn)
稳定性:不稳定
10.5简单选择排序
算法思想:适用于顺序表和链表。
算法性能分析:
空间复杂度O(1)
时间复杂度O(n的平方)
稳定性:不稳定。
10.6堆排序
算法思想:
算法性能分析:
空间复杂度O(1)
时间复杂度O(nlog平方n)
稳定性:不稳定。