常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序、桶排序、基数排序,这些排序各自有各自的特点。按照时间时间复杂度可以分为
每次八前后两个元素比较,判断是否需要互换,一直到序列最后面,这样重复n次。最好情况在第一次排序后看有没有数据交换,如果没有的话说明此时已经有序了,时间复杂度时O(n^2)。 平均时间复杂度也是O(n^2)。
将数据分为有序区间和无序区间,开始有序区间只有一个元素,然后从后面无序区间区第一个元素插入到有序区间中对应的位置。是原地排序,当遇到相同值时可以选择位置前后的防止,所以是稳定排序。可以选择从有序区间后面开始进行大小的比较,所以最好情况下时间复杂度为O(n),平均和最坏情况下时间复杂度都是O(n^2)。
相对于冒泡排序,插入排序在每次数据的移动比冒泡排序的数据交换简单,因此插入排序忧郁冒泡排序。

将数据分为有序区间和无序区间,每次从无需区间找到最小值,放到有序区间的后面。空间复杂度是原地排序。不是稳定排序
将序列递归的差分为左右两个区间,直到区间不能再拆分,然后在每次回归时将左右两个有序区间合并排序(类似两个有序链表的合并)。

//A是数组,n是数组大小
merge_sort(A, n)
{
merge_sort_c(A, p, r);
}
//A是数组,p是开始位置,r是结束位置
merge_sort_c(A, p, r)
{
if(q >= r)
{
return;
}
q = (p + r) / 2;
merge_sort_c(A, p, q);
merge_sort_c(A, q+1, r);
//将有序区间A[p, q],和A[q+1, r]合并为 A[p, r]
merge(A[p, q], A[q+1, r], A[p, r]);
}
对于merge(A[p, q], A[q+1, r], A[p, r])合并函数设计思路:建立一个大小为[p, r]的临时数组temp,将A[p, q], A[q+1, r]中数据按照大小一次放入,然后将temp的值赋给A[p, r]。因此归并排序不是原地排序。当[p, q], A[q+1, r]存在相同值时,我们可以选择总是将[p, q]的值放在前面,从而保证了数据的稳定性。
快速排序采用由上到下的排序思路,每次选择一个参照节点,依照此节点的值,直接原地拆分为小于此节点值的区间和大于此节点值的两个区间,然后将前后两个区间在依照此方法递归拆分,直到无法拆分。
依照快排的拆分思路,如果要找到n个元素中的第k大的元素,可以选择拆分然后比较前后两个区间A[p, q]和A[q+1, r],判断q>k是否成立,从而选择继续实在前区间找还是在后区间继续找。