快速排序(Java),针对重复元素
来源:互联网 发布:cpb 面膜 知乎 编辑:程序博客网 时间:2024/06/05 20:24
与归并排序一样,快速排序也是采用分治策略。但是归并排序的计算量主要集中在有序子序列的合并上,而子序列的划分几乎不花费时间。快速排序恰恰相反,可以在o(1)的时间内完成子序列的合并,对于将原问题划分上需要花费O(n)的时间。对于子序列的划分上,可能的划分是极不平等的,因此该算法不能保证最坏情况下的O(nlogn)的时间复杂度。一般来说,快排是首选的算法。
因此:版本一
package Basic.QuickSort;import java.util.Random;/** * 该方法对于出现大量的重复元素的时候,轴点位置总是接近与lo,子序列的划分极不均匀,二分递归退化为线性递归,递归深度接近于O(n),运行时间接近于O(n2) * 在移动lo和hi时,同时比较相邻元素的:lo与hi会交替移动,二者移动的距离大致相等。见于第二版本,而对于重复元素不多的时候,法二反而会增加计算量。 */public class QuickSort_v1 { public static void main(String[] args) { int[] array = {9, 10, 5, 84, 2, 45, 1, 4, 56, 1}; quickSort(array, 0, array.length - 1); for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } public static void quickSort(int[] array, int lo, int hi) { if (lo >= hi) return; int mid = partition(array, lo, hi); quickSort(array, lo, mid - 1); quickSort(array, mid + 1, hi); } private static int partition(int[] array, int lo, int hi) { swap(array, lo, hi); int key = array[lo]; while (lo < hi) { while (lo < hi && array[hi] >= key) hi--; array[lo] = array[hi]; while (lo < hi && array[lo] <= key) lo++; array[hi] = array[lo]; } array[hi] = key; return hi; } private static void swap(int[] array, int lo, int hi) { int temp = 0; Random r = new Random(); int k = r.nextInt(10) % (hi - lo + 1) + lo; temp = array[lo]; array[lo] = array[k]; array[k] = temp; }}
版本二:
该方法对于出现大量的重复元素的时候,轴点位置总是接近与lo,子序列的划分极不均匀,二分递归退化为线性递归,递归深度接近于O(n),运行时间接近于O(n2)在移动lo和hi时,同时比较相邻元素的:lo与hi会交替移动,二者移动的距离大致相等。见于第二版本,而对于重复元素不多的时候,法二反而会增加计算量。
package Basic.QuickSort;import java.util.Random;import static Basic.QuickSort.QuickSort_v1.quickSort;/** * */public class QuickSort_v2 { public static void main(String[] args) { int[] array = {9, 10, 5, 84,56 ,96,2, 45, 1, 4, 56,1,10000}; quickSort2(array, 0, array.length - 1); for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } public static void quickSort2(int[] array, int lo, int hi) { if (lo >= hi) return; int mid = partition(array, lo, hi); quickSort(array, lo, mid - 1); quickSort(array, mid + 1, hi); } private static int partition(int[] array, int lo, int hi) { swap(array, lo, hi); int key = array[lo]; while (lo < hi) { while (lo < hi) { if (key < array[hi]) hi--; else { array[lo++] = array[hi]; break; } } while (lo < hi) { if (array[lo] < key) lo++; else { array[hi--] = array[lo]; break; } } } array[lo] = key; return lo; } private static void swap(int[] array, int lo, int hi) { int temp = 0; Random r = new Random(); int k = r.nextInt(10) % (hi - lo + 1) + lo; temp = array[lo]; array[lo] = array[k]; array[k] = temp; }}
阅读全文
0 0
- 快速排序(Java),针对重复元素
- 针对相同元素值的快速排序
- 快速排序(三路划分)解决大量重复元素
- 算法笔记 //05_有重复元素的排列问题(针对字母排序)
- java 两个相同元素的List,合并排序去除重复元素的快速算法
- 针对重复键值的3路快速排序算法
- 算法导论7-2,针对相同元素的快速排序
- java类集--排序及重复元素说明
- 微软面试题:三路划分快速排序---针对重复关键字的改进
- 排序单链表去重复元素
- 算法导论-7-2 针对有相同元素值的快速排序
- 算法导论第七章思考题7-2针对相同元素的快速排序-c++
- 排序-快速排序-优化-使用三向切分(优化重复元素的情况
- 【Java类集】_排序及重复元素说明笔记(实例亲测)
- 【Java类集】_排序及重复元素说明笔记(实例亲测)
- Java实现单链表(已排序)去重(保留重复元素第一次出现的节点)
- Java类集 _排序及重复元素说明
- JAVA类集----Set接口排序及重复元素说明
- 使用qt4.8.6新建工程
- 【Scikit-Learn 中文文档】机器学习: scikit-learn 中的设置以及预估对象
- python中列表的常用方法
- 二级联动
- Centos 挂载镜像安装 yum
- 快速排序(Java),针对重复元素
- 如何突破JAVA程序员三年的门槛
- 谋杀案和杨辉三角改进版
- Android开发中第三方炫酷的控件
- [SDOI2009]晨跑 bzoj 1877 费用流
- 【Scikit-Learn 中文文档】监督学习:从高维观察预测输出变量
- RoboCup Rescue Simulator Tutorial core
- MT8735 andorid7.0 充电调试总结(2)——电池驱动流程关键代码分析
- ISP、IAP、ICP烧写方式的区别