与归并排序一样,快速排序也是采用分治策略。但是归并排序的计算量主要集中在有序子序列的合并上,而子序列的划分几乎不花费时间。快速排序恰恰相反,可以在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 针对重复元素相关推荐

  1. java去重复元素并打印_Java打印数组中重复元素

    Java打印数组中重复元素 1 说明 在此程序中,我们需要打印数组中存在的重复元素.这可以通过两个循环来完成.第一个循环将选择一个元素,第二个循环将通过将所选元素与其他元素进行比较来遍历整个数组.如果 ...

  2. Java中ArrayList问题:删除一个ArrayList中的重复元素,注意留意一个问题

    该问题有两种方法: 一 利用两个数组,此法简单,不讨论 二 利用一个数组,从第0个开始依次取元素,并在其后元素中查找是否有该元素,有则删掉后面的重复元素,依次遍历.---但是这种情况要特别注意,当后续 ...

  3. Java查找数组重复元素,并打印重复元素、重复次数、重复元素位置

    面试题查找重复元素并打印重复次数和重复位置,一顿懵逼,回来死磕写下来,打印指定重复次数和最大次数,其他在此基础上可以再更新 package sort; import org.testng.annota ...

  4. java arraylist 删除回车符_2种Java删除ArrayList中的重复元素的方法

    这篇文章将给出两种从ArrayList中删除重复元素的方法,分别是使用HashSet和LinkedHashSet. ArrayList是Java中最常用的集合类型之一.它允许灵活添加多个null元素, ...

  5. java 集合自定义元素_java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。...

    import java.util.*;/*将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据封装 ...

  6. JAVA取数两个数组交集,考虑重复和不重复元素

    1.考虑不重复元素,重复元素不添加 import java.awt.List; import java.util.ArrayList; import java.util.TreeSet; public ...

  7. java arraylist 对象 删除_ArrayList实现删除重复元素(元素不是对象类型的情况)...

    package 集合; import java.util.ArrayList; import java.util.Iterator; /* * 去除ArrayList里面的重复元素 * * */ pu ...

  8. Java面试题:在一个递增的数组里面,找出任意两个数的和等于100,编写程序输出这些数对,可以假设数组中不存在重复元素

    本文使用两种算法来实现,分别是二分查找法和插值查找法,发现插值查找法更好,更快地找到需要的数据. 代码如下: package com.moson.search;import java.util.Arr ...

  9. java arraylist 重复_Java中ArrayList去除重复元素

    Java中ArrayList去除重复元素 //删除ArrayList中重复元素 public   static   void  removeDuplicate(ArrayList list)   { ...

最新文章

  1. cogs 服务点设置
  2. 微服务架构中的雪崩问题产生原因及解决办法
  3. 使用Xpose突破安卓App禁止截屏限制
  4. is属性用法 vue_Vue中is属性的用法 可以动态切换组件
  5. 【NOI2009】诗人小G【决策单调性dp】
  6. php mysql复杂查询_半复杂的PHP / MySQL Select语句
  7. python文本文件csv_我的第一个Python项目:如何将杂乱无章的文本文件转换为纯净的CSV文件
  8. c语言输出字符串长度 空格,C++指针变量:输入一个字符串,删除字符串中所有空格,输出删除空格后字符串的长度,需编写以下功能函数...
  9. 内固定取出术后护理_“钢铁侠“们注意了——身体内的钢板或内固定需要取出吗?...
  10. Android之哭笑不得的BUG--xml设置的padding不起作用,幕后黑手竟然是?
  11. android 4.0 屏蔽home键实现
  12. iOS播放器 - AVPlayer
  13. 【设计模式】java设计模式总述及观察者模式
  14. [BX]和loop指令06 - 零基础入门学习汇编语言28
  15. 总结一下2010--2011初看的书
  16. python2.7安装mysqldb_python2.7安装MySQLdb库
  17. winscp 同步_使用WinSCP进行简单代码文件同步
  18. python无法写入文件夹_python write无法写入文件的解决方法
  19. 在本地搭建Discuz!论坛
  20. NGFF、M.2、NVME、SATA、PCIE、USB的层次和区别:协议?接口?

热门文章

  1. MySQL删除表中的数据
  2. X的旅游计划 C语言 SDUT
  3. 华为mate9升级安卓9.0以后,流畅度和电池耐用度,比安卓8.0系统有啥变化吗?
  4. datagrid编辑单元格回车换行_DataGridView单元格换行(WrapMode)
  5. 基于MDKA5D31-EK_T70开发板的QT示例-demo14:Ftp演示
  6. 万能函数SUMPRODUCT超实用的10种经典用法
  7. pdb跳出for循环
  8. 获取所有的emoji表情
  9. python爬取图解_20行PYTHON代码爬取微博高清大图,小白练手绝佳案例
  10. linux脚本除号,Linux Shell 脚本:基本操作符