一直想理解一下基本的排序算法,最近正好在搞java所以就一并了(为了便于理解,这儿都是以从小到大排序为目的)
也就是比较连续的两个值,如果前面一个值大于后面一个值,则交换。
注意点:第二重循环参数
就是从头到尾选择每个位置放这个位置到最后一个位置的最小值,其中我们可以标记,减少交换次数
注意点:判断后再进行异或的交换
就是从头到尾遍历每个点,每个点再从尾到头找这个值放在数组的位置
注意点:temp与谁比较
其实就类似分治的方法,取一个中枢元素,然后找到一个位置放这个中枢元素,保证这个位置前面的值不大于它,后面的值不小于它,接着分别递归
注意点:中间两个while的顺序
其实很简单,就是从中间分成左右两个数组分别递归,在最后返回时我们保证两个数组都是有序数组再合并,可以知道使用双指针的方法可以在O(n)的
注意点:指针向后移动
极其简单的算法,简答的方法是是设置步长并每次减一半,接着使用插入排序,排的是相隔步长的元素
为了让额外的空间复杂度为O(1),可以首先倒着使用原数组下沉的思想(就是保证了此点的子树一定是堆)建立大顶堆,
接着依次将头放到新空出来的位置,再更新堆
注意点:边界值得大小
就是将数字变成数组下标,这种排序主要是保证数据范围比较小。
首先从低到高枚举的是数字的每一位,每一位根据0-9的顺序放入桶中储存,再放回原数组,注意负数,还有就是非常耗费空间
将数组分到有限数量的桶子里。每个桶子再个别排序
接着还有一些比较奇特的排序方式:
鸡尾酒排序:双向冒泡排序
梳排序:在冒泡排序下让步长不为1,而且每次步长除以1.3
奇偶排序:多核处理有优势;先将待排序数组的所有奇数位与自己身后相邻的偶数位相比较,如果前者大于后者,则进行交换,直到这一趟结束。然后将偶数位与自己身后相邻的奇数位相比较,如果前者大于后者,则进行交换,直到这一趟结束。重复
外排序:以上都是在内存中排序的算法,即可以在内存中直接寻址,而外排序则可能是输入数据在磁带上,它使用的是归并排序,但是可以是多路归并排序
树形选择排序(锦标赛排序) :对N个数字,选出最小(大)的n/2个数,再进行新一轮的比较,直到选出最小(大)的。
1.把N个数放到完全二叉树的叶子节点,两两比较,选出最小的作为根节点,且保存到数组中
2.把最小的原始值设为无穷大,从那个地方开始新一轮比较
第一次需要比较n-1次,之后都是log2(n)次
对于一般的内部排序,基本使用的是插入排序,希尔排序或者快速排序,主要是根据输入数据的大小来确定。
堆排序比希尔排序要慢,但是也可以根据Floyd提出的改进算法移动一次数据来优化。