快速排序(java)
快速排序是冒泡排序的优化,是一种非常高效的排序, 甚至是目前为止最高效的排序,其思想是这样的:设数组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、递归数组的两个子数组
对应代码为:
- package quickSort;
- public class QuickSort {
- public int[] quicksort(int a[], int low, int high) {
- int i, j;
- if (low >= high) {
- return a;
- } else {
- int standar = a[low];
- i = low;
- j = high;
- while (i < j) {
- while (i < j && a[j] >= standar) {
- j--;
- }
- if(i < j){
- a[i] = a[j];
- i++;
- }
- while (i < j && a[i] < standar) {
- i++;
- }
- if(i < j){
- a[j] = a[i];
- j--;
- }
- }
- a[i] = standar;
- quicksort(a, low, i - 1);
- quicksort(a, i + 1, high);
- return a;
- }
- }
- public int[] sort(int a[], int low, int high) {
- a = quicksort(a, low, high);
- return a;
- }
- }
测试类为:
- package Test;
- import org.omg.CORBA.Current;
- import bubbleSort.BubbleSort;
- import insertSort.InsertSort;
- import quickSort.QuickSort;
- import selectSort.SelectSort;
- public class Test {
- public static void main(String[] args) {
- QuickSort quickSort = new QuickSort();
- int[] array = createArray();
- long ct1 = System.currentTimeMillis();
- int[] arrays = quickSort.sort(array, 0, array.length - 1);
- long ct2 = System.currentTimeMillis();
- display(arrays);
- System.out.println("所消耗的时间:" + (ct2 - ct1));
- }
- public static void display(int[] arrays) {
- System.out.println("排序后数据:");
- for (int i = 0; i < arrays.length; i++) {
- System.out.print(arrays[i] + "\t");
- if ((i + 1) % 10 == 0) {
- System.out.println();
- }
- }
- System.out.println();
- }
- public static int[] createArray() {
- int[] array = new int[100000];
- System.out.println("数组中元素是:");
- for (int i = 0; i < 100000; i++) {
- array[i] = (int) (Math.random() * 1000);
- System.out.print(array[i] + "\t");
- if ((i + 1) % 10 == 0) {
- System.out.println();
- }
- }
- System.out.println();
- return array;
- }
- }
时间复杂度:
经过计算:10000个数的排序时间为2 ms, 100000个数的排序时间为 40ms , 比上次测试的 冒泡排序14000ms 快了 300多倍。
快速排序(java)的更多相关文章
- 快速排序 Java实现的快速排序
快速排序 Java实现的快速排序: package xc; import java.util.Arrays; import java.util.Random; /** * * @author dax ...
- 基本排序算法——快速排序java实现
简单的快速排序算法,我竟然花费了如此多的时间来写作,好好学习. /** * */ package basic.sort; import java.util.Arrays; import java.ut ...
- 排序算法----快速排序java
快速排序是对冒泡排序的一种改进,平均时间复杂度是O(nlogn) import java.util.Arrays; import java.util.Scanner; public class tes ...
- 快速排序 java详解
1.快速排序简介: 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此 ...
- ADV-297 快速排序 java
问题描述 用递归来实现快速排序(quick sort)算法.快速排序算法的基本思路是:假设要对一个数组a进行排序,且a[0] = x.首先对数组中的元素进行调整,使x放在正确的位置上.同时,所有比x小 ...
- 快速排序-java
排序-快速排序 基本思想: 将数据划分为两部分,左边的所有元素都小于右边的所有元素:然后,对左右两边进行快速排序. 划分方法: 选定一个参考点(中间元素),所有元素与之相比较,小的放左边,大的放右边. ...
- 数组排序-冒泡排序-选择排序-插入排序-希尔排序-快速排序-Java实现
这五种排序算法难度依次增加. 冒泡排序: 第一次将数组相邻两个元素依次比较,然后将大的元素往后移,像冒泡一样,最终最大的元素被移到数组的最末尾. 第二次将数组的前n-1个元素取出,然后相邻两个元素依次 ...
- 排序算法之快速排序(java实现)
package com.javaTest300; public class Test039 { public static void main(String[] args) {// 快速排序 int ...
- 快速排序java
快速排序(Quicksort)是对冒泡排序的一种改进.它是先在数组中找到一个关键数,第一趟排序将比关键数小的放在它的左边,比关键数大的放在它的右边.当第一趟排序结束后,再依次递归将左边和右边的进行排序 ...
- 快速排序Java实现
package practice; import edu.princeton.cs.algs4.*; public class TestMain { public static void main(S ...
随机推荐
- 12 redis之aof日志持久化
Aof 的配置 appendonly no # 是否打开 aof日志功能 appendfsync always # 每1个命令,都立即同步到aof. 安全,速度慢 appendfsync everys ...
- 800元组装一台3D打印机全教程流程
我最近正好要组装一台新的reprap的kossel delta型开源3d打印机,这台机器性价比非常高,具有速度快,静音,三臂并联结构,扩展性强,便宜的特点.图纸啥的都有,只是用到mega2560和ra ...
- MyBatis缓存介绍
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 相同提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存.其存储作用域为 Se ...
- shader学习之一:Properties语义块支持的数据类型
_Int ("Int",Int)=2为:变量名("面板显示的名称",数据类型) 对于Int,Float,Range这些数字类型的属性,默认值为单独的数字.对于贴 ...
- zookeeper curator ( 实战一)
目录 zookeeper 的伪集群搭建 写在前面 1.1. zookeeper 安装&配置 1.1.1. 创建数据目录和日志目录: 1.1.2. 创建myid文件 1.1.3. 创建和修改配置 ...
- 微信小程序设计指南
微信小程序设计指南 · 小程序 https://developers.weixin.qq.com/miniprogram/design/index.html
- 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 ...
- SSL:Ubuntu证书配置
CA证书的配置 Ubuntu上CA证书的配置可以通过工具ca-certificates来方便的进行.该工具默认是随Ubuntu安装的,如果没有可以通过下面的命令来安装: sudo apt-get in ...
- ELK日志收集系统搭建
架构图 ELK 架构图:其中es 是集群,logstash 是单节点(猜想除非使用nginx对log4j的网络输出分发),kibana是单机(用不着做成集群). 1.拓扑图 2.logstash ...
- 设置sudo的过期时间
默认sudo的过期时间过短,经常要输入密码 sudo visudo Defaults env_reset找到这行代码 后面加上timestamp_timeout参数,数值是分钟 ,timestamp_ ...