关键字和排序方法中“趟”的含义:
在内部排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一趟排序。
基本思想和特点:
起泡排序:
思想: 起泡排序是一种简单的交换排序,它通过对无序序列区中的相邻记录的关键字进行“比较”和记录位置的“交换”,以实现关键字较小的记录向“一头”漂移,而关键字较大的记录向“另一头”下沉,从而达到记录按关键字非递减(递增)顺序有序排列的目标。
特点:
稳定的排序方法
时间复杂度:最好情况O(n),最坏情况O(n2)
空间复杂度:O(1)
选择排序:
思想:每一趟在n-i+1(i=1,2,…,n-1)个记录中选取关键字最小(大)的记录作为有序序列中第i个记录。
特点:
(1)简单选择排序:
时间复杂度为O(n2)(与待排记录的初始状态无关)
空间复杂度为O(1)
(2)树形选择排序:
时间复杂度为O(nlog2n),需较多辅助存储空间(多了左右子树结构)。
插入排序:
思想:将待排序序列分成有序和无序两个子序列,每次从无序子序列中选择一个待排序元素,将它与已形成的有序子序列中的各个元素比较,寻找符合排序条件的插入位置,将待排序元素插入到该位置。
特点:
稳定的排序方法
时间复杂度O(n2) 当排序序列有序时,其时间复杂度为O(n)
空间复杂度O(1)
算法简便,容易实现
适用于待排序记录数量较小的情况
快速排序:
思想:通过一趟快速排序将待排记录分割成相邻的两个区域,其中一个区域中记录的关键字均比另一个区域中记录的关键字小(区域内不一定有序),然后分别对这两个区域的记录再进行快速排序,直到子序列的长度为1,使整个序列有序。
特点:
时间复杂度:
最佳状况(当每次分割的两个区块都均匀大小时):O(n*log2n)
最坏状况(待排序数据序列本身有序时):O(n2)
平均状况: O(n*log2n)
空间复杂度:主要来源于排序过程中递归的深度(即递归使用的栈的深度)
最佳状况: O(log2n)
最坏状况: O(n)
平均状况:介于O(log2n)和O(n)之间
******
平均时间复杂度低,适用于完全随机的序列。
不稳定排序;空间效率低;
结点顺序不好(有序)则效率低(初始记录序列按关键字有序时,快速排序将蜕化为冒泡排序)。
shell排序:
思想:根据间隔值d将待排序记录序列分割成为若干子序列(即把那些位置相隔为d的元素看作一个子序列),并对每个子序列分别进行直接插入排序,每趟之后减小d值,重复上述过程,直到d<1为止。
待整个序列中的记录“基本有序”时再对全体记录进行一次直接插入排序。
d的取值将直接影响shell排序的效率。
特点:
不稳定的排序方法
时间复杂度与增量序列dlta[]相关,约为n1.3(阅读教材p272)(应使增量序列中的值没有除1之外的公因子。)
空间复杂度O(1)
堆排序:
思想:与堆对应的完全二叉树中所有非终端结点的值均不大于(或不小于)其左、右孩子结点的值。堆的外观为根(子树根)最小或最大的顺序存储的完全二叉树。
特点:
不稳定排序
时间复杂度O(nlogn)
空间复杂度O(1)
运行时间主要耗费在建初始堆和调整堆上,适用于大批量数据的部分排序(如1000个数据取5个关键字最大的数。)
归并排序:
思想:将两个或两个以上的有序表组合成一个新的有序表的过程。
特点:
稳定排序
时间复杂度O(nlog2n)
空间复杂度O(n)
适用于处理大批量数据的排序
基数排序:
思想:
特点:
时间复杂度 | 空间复杂度
插入排序: O(n2) O(1)
归并排序: O(nlogn) O(n)
选择排序: O(n2) O(logn)
冒泡排序: O(n2) O(1) 稳定排序
------------------------------------------------------
快速排序: O(nlog2n)--O(n) O(1) 不稳定排序
Shell排序: O(n1.3) O(1)
堆排序: O(nlog2n) O(1)
基数排序: O(d(n+rd)) O(rd)