用 Java 实现一个快速排序算法

       快速排序是排序算法中效率最高的一种,它是利用递归的原理,把数组无限制的分成两个部分,直到所有数据都排好序为止。

快速排序是对冒泡排序的一种改进。它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

如果要排序的数组是 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 到最后的数组,再进行递归的快速排序。

以下是该题目的代码实现:

  1 package com.fhcq.quicksort;
  2
  3 public class QuickSort {
  4
  5 	public static void main(String[] args) {
  6 		// TODO Auto-generated method stub
  7
  8 		int[] a = new int[] { 5, 9, 8, 4, 7, 3, 6, 2 }; //定义数组
  9 		print(a); //打印之前的顺序
 10 		sort(a, 0, a.length-1); //排序
 11 		print(a); //打印排序后的结果
 12 	}
 13
 14 	//打印方法
 15 	private static void print(int[] before) {
 16 		// TODO Auto-generated method stub
 17 		for (int i = 0; i < before.length; i++) { //遍历
 18 			System.out.print(before[i] + " "); //打印,以空格隔开
 19 		}
 20 		System.out.println(); //换行
 21 	}
 22
 23 	//排序方法
 24 	 static void sort(int[] a, int low, int high) {
 25 		// TODO Auto-generated method stub
 26 		if(low >= high){ //low小于或等于high,则直接返回
 27 			return;
 28 		}
 29 		if((high - low) == 1){ //如果只有两个数字,则直接比较
 30 			if(a[0] > a[1]){
 31 				swap(a, 0, 1);
 32 				return;
 33 			}
 34 		}
 35 		int pivot = a[low]; //取第一个数作为中间数
 36 		//左滑块当前的下标数,从第2个数字开始,从最后一个开始
 37 		int left = low + 1;
 38 		int right = high; //右滑块当前的下标数
 39 		while(left < right){ //左右循环
 40 			//从左边开始找
 41 			while(left < right && left <= high){ //如果左小于右则一直循环
 42 				if(a[left] > pivot){ //找到一个大的数字
 43 					break;
 44 				}
 45 				left++; //左下标往右边走一点
 46 			}
 47 			//从右边开始找
 48 			while(left <= right && right > low){ //如果左大于右则一直循环
 49 				if(a[right] <= pivot){ //找到一个小的数字
 50 					break;
 51 				}
 52 				right--; //右下标往左走一点
 53 			}
 54 			if(left < right){ //如果还没找完,则交换数字
 55 				swap(a,right,left);
 56 			}
 57
 58 		swap(a,low,right); //交换中间数字
 59 		sort(a,low,right); //排序前面的数组
 60 		sort(a,right+1,high); //排序后边数组
 61 		}
 62 	}
 63
 64 	 //掉位方法
 65 	private static void swap(int[] array, int i, int j) {
 66 		// TODO Auto-generated method stub
 67
 68 		int temp;
 69 		temp = array[i];
 70 		array[i] = array[j];
 71 		array[j] = temp;
 72 	}
 73
 74 }
 75 
时间: 2024-11-05 02:18:26

用 Java 实现一个快速排序算法的相关文章

面试指南 - 请实现一个快速排序算法

快速排序算法是诸多排序算法中性能较优的一种,也是很多内建排序类型所采用的算法.该算法在.NET面试和笔试中经常被考查到,下面将详细介绍快速排序的算法思想及代码示例. 所涉及的知识点: 使用C#实现快速排序算法 分析问题: 快速排序算法是公认的最为优秀的内部排序算法之一,其实实现思想很简单,并且在一般情况下性能较高.下面是该算法的基本思想: 假设待排序的序列为L[m...n],其中L[m...midlle-1]中的每个元素都小于L[midlle],而L[midlle+1...n]中的每个元素都大于

Java编写一个路由算法,并txt输入输出

路由算法:1-9均代表主机名称 1. 输入: 图3拓扑的输入文件为input.txt,本算法为双向线,来回只需输入一个即可 Input.txt: leftnodeID,rightnodeID,bandwidth 1,3,100 1,4,100 2,3,100 2,4,100 3,4,100 3,5,100 3,6,100 4,5,100 4,6,100 5,6,100 5,7,100 5,8,100 6,7,100 6,8,100 ; srcNodeID,dstNodeID,bandwidth

java实现的快速排序算法

快速排序的原理:选择一个关键值作为基准值.比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的).一般选择序列的第一个元素. 一次循环:从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换.找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换.直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两

用 Java 实现一个插入排序算法

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法:插入排序法.插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据搜索,算法适用于少量数据的排序. 插入排序算法把要排序的数组分成两部分:第一部分包含了这个数组除了最后一位的所有元素,而第二部分就只包含这一个元素(即待插入元素).在第一部分排序后,再将最后这个元素插入到第一部分中的正确位置. 说明:这里的最后一位,也可以

用 Java 实现一个冒泡排序算法

冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面.即首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将小数放前,大数放后,一直比较到最小数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最小数.如此下去,直至最终完

Lua中table内建排序与C/C++/Java/php/等内排序算法的排序效率比较

Lua这类脚本语言在处理业务逻辑作为配置文件的时候方便省事 但是在大量需要 运算的地方就显得略微不足   按照 Lua内建排序算法 对比C/C++ PHP Java等的快速排序算法进行一下比较. 快速排序算法是基于冒泡排序,优化而来,时间复杂度T(n)=O(nLog2n)  ,可见内部采用了二分策略 . 发现在LuaIDE LDT下直接运行效率要比 通过C++加载运行Lua脚本效率高的多  拿500W个数据排序 来说  ,脚本如下 同样的排序脚本Lua解释器的内置排序算法在LDT下,运行速度比通

排序算法之 Java简单快速排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class SimpleQuick { public int[] sort(int[] arr,int left,int right){ if ( arr == null || a

快速排序算法--java

快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置.递归快速排序,将其他n-1个元素也调整到排序后的正确位置.最后每个元素都是在排序后的正 确位置,排序完成.所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归. 举例说明一下吧,这个可能不是太好理解.假设要排序的序列为 2 2 4 9 3 6 7 1 

java:快速排序算法与冒泡排序算法

 Java:快速排序算法与冒泡算法 首先看下,冒泡排序算法与快速排序算法的效率: 如下的是main方法: public static void main(String[] args) { //快速排序算法测试 int[] qArray = new int[100000]; for (int i = 0; i < 100000; i++){ qArray[i] = (int) (Math.random() * 100000); } long beforeQ = System.currentTi