1.冒泡排序
算法思想先从数组的第一个元素开始,一次比较相邻的两个元素,若前者比后者大则交换两个数的位置,然后处理下一对,依次类推,不断处理数组;
时间复杂度:O(n^2)
空间复杂度: O(1)
算法特点:稳定排序
可用于链式存储结构
当初始记录无序 n较大时不适合采用。
2.选择排序:
线性逐一扫描数组中的元素,从中挑出最小的元素将其插入已经排好序的序列中,再次从未排序列中选出最小的元素插入到已经有序序列的末尾。
时间复杂度:O(n^2)
空间复杂度:O(1)
算法特点: 由于该算法中存在<待排序列最小记录>与<有序序列后面第一个元素>的交换,所以是不稳定的排序;
无论记录的初始状态时什么样的,每一次为了从待排序列中选出当前的最小元素,所比较的次数是相同的。
可以用于链式存储结构。
该算法的移动记录的次数较少,所以适合用于移动代价较大的情况。
3.1插入排序之直接插入:
逐个将数组中的数据插入到有序表中
时间复杂度:O(n^2)
空间复杂度:O(1)
算法特点:稳定排序;
当记录无序,n较大的时候,该算法的复杂度较高。
3.2插入排序之折半插入
将数据插入到有序表中的时候采用二分查找的方式确定新来元素在有序表中的位置。
时间复杂度:仍为O(n^2),因为记录移动的次数不变。
空间复杂度:O(1)
算法特点:稳定排序;
只能用顺序存储;
适用于初始记录无序,n较大的情况;
4.MergeSort
将待排序列中前后相邻的两个有序序列归并为一个有序序列。
1) 时间复杂度:对于n个记录需要递归调用Log2n次,关键字比较次数不超过n,所以时间复杂度是O(Log2n)
2)空间复杂度:数组实现时需要需要创建更大的新数组来存储合并后的两个子表。递归调用需要和待排记录相等的存储空间O(n)。链表实现时不需要额外的存储空间,但需要开辟递归工作栈。
3)算法特点:稳定排序,
5.QuickSort
随即挑选一个元素对数组进行分割 ,将所有比它小的元素放到前面,所有比它大的元素放到后面。
1.时间复杂度分析:
最好情况:每一趟排序后都能将记录序列均能分割成长度大致相等两个子表(递归树是一棵完全二叉树),n个元素的序列中对枢轴的定位代价为O(n),此时进行log2n次递归调用,所以总的时间代价为O(nlogn)
最坏情况:在已经排好序的情况下(每次取第一个元素为枢轴时),递归树是一棵单支树,退化为简单排序O(n)。
空间复杂度:
额外的存储空间用来保存枢轴,空间复杂度与递归深度相等
最好情况:O(log2n)
最坏情况:O(n)
算法特点:记录非顺序的移动,导致排序是不稳定的;
适用于待排记录顺序存储,很难用于链式存储;
适合于n较大而且初始记录无序的情况