快速排序是冒泡排序的优化,是一种非常高效的排序, 甚至是目前为止最高效的排序,其思想是这样的:设数组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多倍。

最新文章

  1. 关于CSS初步入门简述1
  2. NYOJ 737 石子合并(一)
  3. JNA 如何 加载多个 存在依赖的 DLL 库
  4. SQL2008关于quotename的用法
  5. Oracle学习系列7
  6. sail.js学习 - 一些问题
  7. jQuery+AJAX实现网页无刷新上传
  8. JavaCodeTra 猴子选猴王 约瑟夫循环
  9. Unity Manual 用户手册
  10. 表单验证提交——submit与button
  11. 搭建 Linux 下 GitLab 服务器(转)
  12. 201521123027 《JAVA程序设计》第五周学习总结
  13. Maven的下载、安装与环境配置
  14. Java Socket通信代码片
  15. Kafka Tuning Recommendations
  16. python 图片识别灰度
  17. 产品大神1--工具axure
  18. Thymeleaf模板布局
  19. python eric6 IDE
  20. linux 安装软件各种错误集锦及解决方法

热门文章

  1. android 底部菜单栏实现(转)
  2. android shareSDK 微博分享案例
  3. 扩容数据盘_Linux
  4. BZOJ1815: [Shoi2006]color 有色图
  5. AndroidUI组件之ImageSwitcher
  6. IOS AFNetWorking 设置超时时间
  7. Makefile中的$(@:_config=)什么意思?【转】
  8. Maven2与maven1之间的区别
  9. Hadoop- 流量汇总程序之如何实现hadoop的序列化接口及代码实现
  10. Spring MVC文件上传下载工具类