快速排序 Java 针对重复元素
与归并排序一样,快速排序也是采用分治策略。但是归并排序的计算量主要集中在有序子序列的合并上,而子序列的划分几乎不花费时间。快速排序恰恰相反,可以在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;}
}
快速排序 Java 针对重复元素相关推荐
- java去重复元素并打印_Java打印数组中重复元素
Java打印数组中重复元素 1 说明 在此程序中,我们需要打印数组中存在的重复元素.这可以通过两个循环来完成.第一个循环将选择一个元素,第二个循环将通过将所选元素与其他元素进行比较来遍历整个数组.如果 ...
- Java中ArrayList问题:删除一个ArrayList中的重复元素,注意留意一个问题
该问题有两种方法: 一 利用两个数组,此法简单,不讨论 二 利用一个数组,从第0个开始依次取元素,并在其后元素中查找是否有该元素,有则删掉后面的重复元素,依次遍历.---但是这种情况要特别注意,当后续 ...
- Java查找数组重复元素,并打印重复元素、重复次数、重复元素位置
面试题查找重复元素并打印重复次数和重复位置,一顿懵逼,回来死磕写下来,打印指定重复次数和最大次数,其他在此基础上可以再更新 package sort; import org.testng.annota ...
- java arraylist 删除回车符_2种Java删除ArrayList中的重复元素的方法
这篇文章将给出两种从ArrayList中删除重复元素的方法,分别是使用HashSet和LinkedHashSet. ArrayList是Java中最常用的集合类型之一.它允许灵活添加多个null元素, ...
- java 集合自定义元素_java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。...
import java.util.*;/*将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据封装 ...
- JAVA取数两个数组交集,考虑重复和不重复元素
1.考虑不重复元素,重复元素不添加 import java.awt.List; import java.util.ArrayList; import java.util.TreeSet; public ...
- java arraylist 对象 删除_ArrayList实现删除重复元素(元素不是对象类型的情况)...
package 集合; import java.util.ArrayList; import java.util.Iterator; /* * 去除ArrayList里面的重复元素 * * */ pu ...
- Java面试题:在一个递增的数组里面,找出任意两个数的和等于100,编写程序输出这些数对,可以假设数组中不存在重复元素
本文使用两种算法来实现,分别是二分查找法和插值查找法,发现插值查找法更好,更快地找到需要的数据. 代码如下: package com.moson.search;import java.util.Arr ...
- java arraylist 重复_Java中ArrayList去除重复元素
Java中ArrayList去除重复元素 //删除ArrayList中重复元素 public static void removeDuplicate(ArrayList list) { ...
最新文章
- cogs 服务点设置
- 微服务架构中的雪崩问题产生原因及解决办法
- 使用Xpose突破安卓App禁止截屏限制
- is属性用法 vue_Vue中is属性的用法 可以动态切换组件
- 【NOI2009】诗人小G【决策单调性dp】
- php mysql复杂查询_半复杂的PHP / MySQL Select语句
- python文本文件csv_我的第一个Python项目:如何将杂乱无章的文本文件转换为纯净的CSV文件
- c语言输出字符串长度 空格,C++指针变量:输入一个字符串,删除字符串中所有空格,输出删除空格后字符串的长度,需编写以下功能函数...
- 内固定取出术后护理_“钢铁侠“们注意了——身体内的钢板或内固定需要取出吗?...
- Android之哭笑不得的BUG--xml设置的padding不起作用,幕后黑手竟然是?
- android 4.0 屏蔽home键实现
- iOS播放器 - AVPlayer
- 【设计模式】java设计模式总述及观察者模式
- [BX]和loop指令06 - 零基础入门学习汇编语言28
- 总结一下2010--2011初看的书
- python2.7安装mysqldb_python2.7安装MySQLdb库
- winscp 同步_使用WinSCP进行简单代码文件同步
- python无法写入文件夹_python write无法写入文件的解决方法
- 在本地搭建Discuz!论坛
- NGFF、M.2、NVME、SATA、PCIE、USB的层次和区别:协议?接口?
热门文章
- MySQL删除表中的数据
- X的旅游计划 C语言 SDUT
- 华为mate9升级安卓9.0以后,流畅度和电池耐用度,比安卓8.0系统有啥变化吗?
- datagrid编辑单元格回车换行_DataGridView单元格换行(WrapMode)
- 基于MDKA5D31-EK_T70开发板的QT示例-demo14:Ftp演示
- 万能函数SUMPRODUCT超实用的10种经典用法
- pdb跳出for循环
- 获取所有的emoji表情
- python爬取图解_20行PYTHON代码爬取微博高清大图,小白练手绝佳案例
- linux脚本除号,Linux Shell 脚本:基本操作符