快速排序是冒泡排序的优化,是一种非常高效的排序, 甚至是目前为止最高效的排序,其思想是这样的:设数组a中存放了n个数据元素,low为数组的低端下标,high为数组的高端下标,从数组a中任取一个元素(通常取a[low])做为标准元素,以该标准元素调整数组a中其他各个元素的位置,使排在标准元素前面的元素均小于标准元素,排在标准元素后面的均大于或等于标准元素,由此将数组根据标准元素分解成了两个子数组。对这两个子数组中的元素分别再进行方法类同的递归快速排序。算法的递归出口条件是low≥high。

可能讲到这里你不太懂, 但是看完步骤之后你一定会懂得。

步骤如下:

1、有一个数据a [ n ],

2、定义一个低端下标 low 和 一个高端下标 high;

3、定义i, j 两个变量;

4、设置条件:如果 low >= high 算法结束,否则进行以下步骤;

5、取数组第一个数作为标准   int  standar, j = high, i = low

6、当 i  < j 时, 从数组最后向前寻找,如果条件满足 i < j(因为可能在找的过程中i 和  j 的值发生了改变) , 并且a[ j ] >=  standar, j--

  不满足时停止 ,令  a[ i ] = a[ j ], 然后 i 的下标右移 i++;

7、当 i  < j 时, 从数组开始向后寻找,如果条件满足 i < j(因为可能在找的过程中i 和  j 的值发生了改变) , 并且a[ i ] <=  standar, i++

  不满足时停止 ,令  a[ j ] = a[ i ], 然后 i 的下标左移 j--;

8、退出整个循环体、令 i 位置的值为standar

9、递归数组的两个子数组

对应代码为:

  1. package quickSort;
  2.  
  3. public class QuickSort {
  4. public int[] quicksort(int a[], int low, int high) {
  5. int i, j;
  6. if (low >= high) {
  7. return a;
  8. } else {
  9. int standar = a[low];
  10. i = low;
  11. j = high;
  12. while (i < j) {
  13. while (i < j && a[j] >= standar) {
  14. j--;
  15. }
  16. if(i < j){
  17. a[i] = a[j];
  18. i++;
  19. }
  20.  
  21. while (i < j && a[i] < standar) {
  22. i++;
  23. }
  24. if(i < j){
  25. a[j] = a[i];
  26. j--;
  27. }
  28. }
  29. a[i] = standar;
  30. quicksort(a, low, i - 1);
  31. quicksort(a, i + 1, high);
  32. return a;
  33. }
  34. }
  35.  
  36. public int[] sort(int a[], int low, int high) {
  37. a = quicksort(a, low, high);
  38. return a;
  39. }
  40. }

测试类为:

  1. package Test;
  2.  
  3. import org.omg.CORBA.Current;
  4.  
  5. import bubbleSort.BubbleSort;
  6. import insertSort.InsertSort;
  7. import quickSort.QuickSort;
  8. import selectSort.SelectSort;
  9.  
  10. public class Test {
  11. public static void main(String[] args) {
  12.  
  13. QuickSort quickSort = new QuickSort();
  14. int[] array = createArray();
  15. long ct1 = System.currentTimeMillis();
  16. int[] arrays = quickSort.sort(array, 0, array.length - 1);
  17. long ct2 = System.currentTimeMillis();
  18. display(arrays);
  19.  
  20. System.out.println("所消耗的时间:" + (ct2 - ct1));
  21.  
  22. }
  23.  
  24. public static void display(int[] arrays) {
  25. System.out.println("排序后数据:");
  26. for (int i = 0; i < arrays.length; i++) {
  27. System.out.print(arrays[i] + "\t");
  28. if ((i + 1) % 10 == 0) {
  29. System.out.println();
  30. }
  31. }
  32. System.out.println();
  33. }
  34.  
  35. public static int[] createArray() {
  36. int[] array = new int[100000];
  37. System.out.println("数组中元素是:");
  38. for (int i = 0; i < 100000; i++) {
  39. array[i] = (int) (Math.random() * 1000);
  40. System.out.print(array[i] + "\t");
  41. if ((i + 1) % 10 == 0) {
  42. System.out.println();
  43. }
  44. }
  45.  
  46. System.out.println();
  47. return array;
  48. }
  49. }

时间复杂度:

经过计算:10000个数的排序时间为2 ms, 100000个数的排序时间为 40ms , 比上次测试的 冒泡排序14000ms  快了  300多倍。

快速排序(java)的更多相关文章

  1. 快速排序 Java实现的快速排序

    快速排序  Java实现的快速排序: package xc; import java.util.Arrays; import java.util.Random; /** * * @author dax ...

  2. 基本排序算法——快速排序java实现

    简单的快速排序算法,我竟然花费了如此多的时间来写作,好好学习. /** * */ package basic.sort; import java.util.Arrays; import java.ut ...

  3. 排序算法----快速排序java

    快速排序是对冒泡排序的一种改进,平均时间复杂度是O(nlogn) import java.util.Arrays; import java.util.Scanner; public class tes ...

  4. 快速排序 java详解

    1.快速排序简介: 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此 ...

  5. ADV-297 快速排序 java

    问题描述 用递归来实现快速排序(quick sort)算法.快速排序算法的基本思路是:假设要对一个数组a进行排序,且a[0] = x.首先对数组中的元素进行调整,使x放在正确的位置上.同时,所有比x小 ...

  6. 快速排序-java

    排序-快速排序 基本思想: 将数据划分为两部分,左边的所有元素都小于右边的所有元素:然后,对左右两边进行快速排序. 划分方法: 选定一个参考点(中间元素),所有元素与之相比较,小的放左边,大的放右边. ...

  7. 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现

    这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...

  8. 排序算法之快速排序(java实现)

    package com.javaTest300; public class Test039 { public static void main(String[] args) {// 快速排序 int ...

  9. 快速排序java

    快速排序(Quicksort)是对冒泡排序的一种改进.它是先在数组中找到一个关键数,第一趟排序将比关键数小的放在它的左边,比关键数大的放在它的右边.当第一趟排序结束后,再依次递归将左边和右边的进行排序 ...

  10. 快速排序Java实现

    package practice; import edu.princeton.cs.algs4.*; public class TestMain { public static void main(S ...

随机推荐

  1. 12 redis之aof日志持久化

    Aof 的配置 appendonly no # 是否打开 aof日志功能 appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢 appendfsync everys ...

  2. 800元组装一台3D打印机全教程流程

    我最近正好要组装一台新的reprap的kossel delta型开源3d打印机,这台机器性价比非常高,具有速度快,静音,三臂并联结构,扩展性强,便宜的特点.图纸啥的都有,只是用到mega2560和ra ...

  3. MyBatis缓存介绍

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 相同提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存.其存储作用域为 Se ...

  4. shader学习之一:Properties语义块支持的数据类型

    _Int ("Int",Int)=2为:变量名("面板显示的名称",数据类型) 对于Int,Float,Range这些数字类型的属性,默认值为单独的数字.对于贴 ...

  5. zookeeper curator ( 实战一)

    目录 zookeeper 的伪集群搭建 写在前面 1.1. zookeeper 安装&配置 1.1.1. 创建数据目录和日志目录: 1.1.2. 创建myid文件 1.1.3. 创建和修改配置 ...

  6. 微信小程序设计指南

    微信小程序设计指南 · 小程序 https://developers.weixin.qq.com/miniprogram/design/index.html

  7. Greedy Function Approximation:A Gradient Boosting Machine

    https://statweb.stanford.edu/~jhf/ftp/trebst.pdf page10 90% to 95% of the observations were often de ...

  8. SSL:Ubuntu证书配置

    CA证书的配置 Ubuntu上CA证书的配置可以通过工具ca-certificates来方便的进行.该工具默认是随Ubuntu安装的,如果没有可以通过下面的命令来安装: sudo apt-get in ...

  9. ELK日志收集系统搭建

     架构图 ELK  架构图:其中es 是集群,logstash 是单节点(猜想除非使用nginx对log4j的网络输出分发),kibana是单机(用不着做成集群). 1.拓扑图 2.logstash ...

  10. 设置sudo的过期时间

    默认sudo的过期时间过短,经常要输入密码 sudo visudo Defaults env_reset找到这行代码 后面加上timestamp_timeout参数,数值是分钟 ,timestamp_ ...