经典排序算法及特性:
经典排序算法的空间复杂度:
O(1):冒泡、选择、插入、堆、希尔排序
O(logN)~O(N):快速排序
O(N):归并排序
O(M):计数排序、基数排序
经典排序算法的稳定性:
稳定性概念:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。
稳定的排序:冒泡、插入、归并、计数、基数、桶排序
不稳定的排序:选择、快排、堆、希尔排序
一、时间复杂度为O(N^2)的算法有:冒泡排序、选择排序、插入排序;
1.冒泡排序:
第一个数与第二个数比较,大的放后面;第二个数与第三个数,第三个数与第四个数……依次比较,这样一来最大数放在最后。前n-1个数重复上述过程即可得到有序数组。
2.选择排序:
在n个数中选出最小的数放在第一个位置,剩下n-1个数选出最小的数放在第二个位置,依次排序。
或者,找出最大的一个元素,和末尾的元素交换,然后再从头开始,查找第1个到第N-1个元素中最大的一个,和第N-1个元素交换……其实差不多就是冒泡法的思想,但整个过程中需要移动的元素比冒泡法要少,因此性能是比冒泡法优秀的
3.插入排序
二、时间复杂度为O(nlogn)的算法有:归并排序、快速排序、堆排序、希尔排序;
1.归并排序:
第一个数和第二个数,第三个数和第四个数……两两归并、排序,再把相邻的有序区间合并、排序,依次重复进行。
2.快速排序:
随机选择一个数(例如最后一个数),比它小的放左边,比它大的放右边,左右两部分分别递归排序。
3.堆排序
首先建立大小为n的大根堆,堆顶元素(即最大值)与最后一个元素交换,将其脱离大根堆存入有序数组;剩下部分进行大根堆调整后依次拿出堆顶最大值,存入有序数组即可。
4.希尔排序
希尔排序(Shell Sort)是插入排序的一种改良排序算法。关键在于步长的选择。
如图选择步长为4的数比较->步长为3比较->步长为2比较->最终步长为1比较结束。
三、时间复杂度为O(n)的算法有:计数排序、基数排序;
不是基于比较的排序算法,思想来自于桶排序。
1.计数排序
将各元素放入排好序的桶中,拿出后即排好序。
2.基数排序
先按个位数放入桶中排序,拿出序列;再分别按十位、百位放入桶中排序