排序算法:
归并:
原理 :
归并排序:采用归并的思想,分治策略。
将数据不断的进行二分,直到二分为仅一个数。回溯,两个数进行归并 之后,回溯,进行四个数据的归并。在归并时根据要求按顺序合并。依次回溯至迭代起点,归并排序就已完成。
归并的过程:就是将两组顺序的数据,根据数据的大小顺序存入连续内存空间,从而使得数据有序。
代码:
1 | package javatest.sort; |
快速排序
参考:
快速排序用了递归、二分等思想进行实现。
思路:
定义左右指针。left和right。
①选取一个基数。下方代码采用选取第一个的方式,可以随机选择,选取中间的。
②left<right的条件下:从后往前,找到第一个比基数小的数(根据升降序定,这里输出升序)。填入left的位置。
③left<right的条件下:从前往后,找到第一个比基数大的数,填入right的位置
重复②③两步。
一次比较完之后(0(n)),从 left位置左侧都是比基数小的数,右侧都是比基数大的数。
上述步骤划分出左右两块,分别进行上述过程,及递归(因为二分了,时间复杂度0( n*log(n) ))。
快速排序在最坏的情况下,时间复杂度是log(n^2),平均时间复杂度nlog(n)。
快速排序不是稳定排序,在排序过程中相对位置正确的两个数位置依旧可能被替换导致相对位置不是升序(降序)方向。
1 | package javatest; |
堆排序
参考:
堆排序的主要思路:
如果需要升序,则需要利用最大堆。
- 首先,为数据构建最大堆。
- 然后,从后往前遍历,将0位置与i位置进行交换
- 再然后, 为len-1长度的数组进行堆排序,将这部分最大的交换到index=0的位置。
- 重复2-3,一直到每个节点遍历结束,就达到了升序的要求。
1 | package javatest.sort; |