用 Java 实现一个快速排序算法
2017-06-11 14:54
225 查看
快速排序是排序算法中效率最高的一种,它是利用递归的原理,把数组无限制的分成两个部分,直到所有数据都排好序为止。
快速排序是对冒泡排序的一种改进。它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
如果要排序的数组是 A[1]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为中间数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法如下所示:
(1)设置两个变量 i、 j,排序开始的时候:i = 1,j = N–1。
(2)以第一个数组元素作为中间数据,赋值给 privot,即 pivot = A[0]。
(3)从 j 开始向前搜索,即由后开始向前搜索(j--),找到第一个小于 X 的值。
(4)从 i 开始向后搜索,即由前开始向后搜索(i++),找到第一个大于 X 的值,并与上一步找到的数字交换。
(5)重复第3、4步,直到 i >= j。
(6)然后把 j 所在的数字与 pivot 交换。
(7)最后把 j 以前的数组和 j 到最后的数组,再进行递归的快速排序。
以下是该题目的代码实现:
package com.fhcq.quicksort; public class QuickSort { public static void main(String[] args) { // TODO Auto-generated method stub int[] a = new int[] { 5, 9, 8, 4, 7, 3, 6, 2 }; //定义数组 print(a); //打印之前的顺序 sort(a, 0, a.length-1); //排序 print(a); //打印排序后的结果 } //打印方法 private static void print(int[] before) { // TODO Auto-generated method stub for (int i = 0; i < before.length; i++) { //遍历 System.out.print(before[i] + ""); //打印,以空格隔开 } System.out.println(); //换行 } //排序方法 static void sort(int[] a, int low, int high) { // TODO Auto-generated method stub if(low >= high){ //low小于或等于high,则直接返回 return; } if((high - low) == 1){ //如果只有两个数字,则直接比较 if(a[0] > a[1]){ swap(a, 0, 1); return; } } int pivot = a[low]; //取第一个数作为中间数 //左滑块当前的下标数,从第2个数字开始,从最后一个开始 int left = low + 1; int right = high; //右滑块当前的下标数 while(left < right){ //左右循环 //从左边开始找 while(left < right && left <= high){ //如果左小于右则一直循环 if(a[left] > pivot){ //找到一个大的数字 break; } left++; //左下标往右边走一点 } //从右边开始找 while(left <= right && right > low){ //如果左大于右则一直循环 if(a[right] <= pivot){ //找到一个小的数字 break; } right--; //右下标往左走一点 } if(left < right){ //如果还没找完,则交换数字 swap(a,right,left); } swap(a,low,right); //交换中间数字 sort(a,low,right); //排序前面的数组 sort(a,right+1,high); //排序后边数组 } } //掉位方法 private static void swap(int[] array, int i, int j) { // TODO Auto-generated method stub int temp; temp = array[i]; array[i] = array[j]; array[j] = temp; } }
相关文章推荐
- 一个简单的冒泡排序和快速排序算法java实现
- java实现快速排序的分割思想:在快速排序算法中,我们随机在数组中选择一个数字,然后把比选中数字小的数字都排在它前面,比选中数字大的数字都排在它的后面。
- java编程题:用Java实现一个快速排序算法
- 一个用Dijkstra算法实现的路由算法的java程序——3 STDijkstra类
- 一个实现排列和组合的JavaBean
- 一个将数据文件转换成excel文件打印的java实现方法的代码片断(Struts+poi)
- java和jdom实现的一个地址簿源码
- Java.NET --一个基于Java的Microsoft.NET框架的实现
- 推荐一个关于AOP的AOP@WORK的专栏作者的AOP专题系列文章,主要关于Java下的AOP实现,毕竟Java下的AOP实现确实要比.Net下成熟得多,共12篇
- 推荐一个关于AOP的AOP@WORK的专栏作者的AOP专题系列文章,主要关于Java下的AOP实现,毕竟Java下的AOP实现确实要比.Net下成熟得多,共12篇
- 一个用Dijkstra算法实现的路由算法的java程序——2 GraphFromFile类
- Java实现压缩一个目录下所有图片文件
- 今天的问题:一个简单的例子,请帮我解开“接口实现Java‘隐藏实现细目’”的迷惑。
- 一个用Dijkstra算法实现的路由算法的java程序——8 GraphMain类
- 一个用Dijkstra算法实现的路由算法的java程序——9 图信息文件示例
- 一个用Dijkstra算法实现的路由算法的java程序——4 MapCanvas类
- 一个实现MD5的简洁的java类 Jagie 原创
- 快速排序算法的JAVA实现
- 一个C语言实现不含递归的高效快速排序算法
- 求助 用java写一个实现键盘功能按钮的小程序