快速排序(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 ...
随机推荐
- C#游戏开发高速新手教程Unity5.5教程
C#游戏开发高速新手教程Unity5.5教程 试读文档下载地址:http://pan.baidu.com/s/1slwBHoD C#是微软公布的高级程序设计语言.这门语言和C语言一样,已经成为了大学计 ...
- 以python理解Linux的IO多路复用,select、poll、epoll
题外话 之前在看Unix环境高级编程的时候,看完高级IO那一章,感觉自己萌萌哒,0.0 ,有点囫囵吞枣的感觉,之后翻了几篇博客,从纯系统的角度理解,稍微有了点概念,以这两篇为例,可以以后参考: htt ...
- 对EasyDarwin开源项目后续发展的思考:站在巨人的肩膀上再跳上另一个更高的肩膀
2017 EasyDarwin现状 自从2012年EasyDarwin项目创立开始,经过了快5年了,时光飞逝,如今EasyDarwin已经发展成为了不仅仅是一个单纯的开源流媒体服务器项目了,已经是各种 ...
- Asp.Net中判断是否登录,及是否有权限?
不需要在每个页面都做判段, 方法一:只需要做以下处理即可 using System; using System.Collections.Generic; using System.Linq; usin ...
- for (const k in v){ 变量作用域
for (const k in v){ const a=[11,22,33,44]for(let i in a ){console.log(i)i=i+1}console.log('--- ...
- file标签样式修改
1. 这是默认的file样式,无法修改,在网页中用它感觉非常不合群,大部分修改的办法就是把它隐藏,绝对定位一个文本框和一个按钮 这是修改后的样式,之后修改样式就是分别修改文本框和按钮样式了,就非常简单 ...
- Android进程的生命周期
Android系统想要永久的保留一个应用进程差点儿是不可能的.所以系统就须要不断的释放老的或者不太重要的进程以便腾出足够的内存空间来执行新的或者更重要的进程,那么系统怎样决定哪个进程应该保留哪个应该杀 ...
- API的理解和使用——全局命令
全局命令 命令 功能 set 创建键值对 keys 遍历查看所有键 exists 判断一个键是否存在,1存在,0不存在 dbsize 当前数据库中有多少个键 del 删除一个或多个键 expire 设 ...
- node js 安装.node-gyp/8.9.4 权限 无法访问
WARN EACCES user "root" does not have permission to access the dev dir "/root/.jenkin ...
- A. Playing with Paper
这是Codeforces Round #296 (Div. 2)的A题,题意就是: 小明有一张长为a,宽为b的纸,每当要折纸鹤时,就从纸上剪下一个正方形,然后,剩下的纸还可以剪出正方形,要是剩下的纸刚 ...