Java排序算法之快速排序

原创 2013年12月02日 13:33:56

快速排序是C.R.A.Hoare1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。快速排序由于排序效率在同为O(n*logn)的几种排序方法中效率较高,因此经常被采用 。

该方法的基本思想是:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。

package test;

public class Main {
	int count;

	public void quickSort(int[] data, int left, int right) {
		int middle, tempDate;
		int i, j, subcount = 0;
		i = left;
		j = right;
		middle = data[(i + j) / 2];
		do {
			// 找出左边比中间值大的数
			while (data[i] < middle && i < right)
				i++;
			// 找出右边比中间值小的数
			while (data[j] > middle && j > left)
				j--;
			// 将左边大的数和右边小的数进行替换
			if (i <= j) {
				tempDate = data[i];
				data[i] = data[j];
				data[j] = tempDate;
				i++;
				j--;
			}
			System.out.println("  第" + (subcount++) + "次搬动," + "middle="
					+ middle + ",left=" + left + ",right=" + right + ",本次替换i="
					+ (i - 1) + ",j=" + (j + 1));
			for (int a = 0; a < data.length; a++) {
				System.out.print("  " + data[a] + " ");
			}
			System.out.println();
			// 当两者交错时停止
		} while (i < j);
		// 打印数据
		System.out.println("第" + (count++) + "次排序结果," + "middle=" + middle
				+ ",left=" + left + ",right=" + right + ",i=" + i + ",j=" + j);
		for (int a = 0; a < data.length; a++) {
			System.out.print(data[a] + " ");
		}
		System.out.println();
		if (i < right) {
			quickSort(data, i, right);
		}
		if (j > left) {
			quickSort(data, left, j);
		}
	}

	public static void main(String[] args) {
		int[] data = new int[] { 14, 69, 23, 0, 10, 75, 88, 38, 95, 17 };
		// 打印数据
		System.out.println("原生数据:");
		for (int i = 0; i < data.length; i++) {
			System.out.print(data[i] + " ");
		}
		System.out.println();
		Main sort = new Main();
		sort.quickSort(data, 0, data.length - 1);
		System.out.println("最后数据:");
		for (int i = 0; i < data.length; i++) {
			System.out.print(data[i] + " ");
		}
		// 打印数据
		System.out.println();
	}
}

输出:
原生数据:
14 69 23 0 10 75 88 38 95 17 
  第0次搬动,middle=10,left=0,right=9,本次替换i=0,j=4
  10   69   23   0   14   75   88   38   95   17 
  第1次搬动,middle=10,left=0,right=9,本次替换i=1,j=3
  10   0   23   69   14   75   88   38   95   17 
第0次排序结果,middle=10,left=0,right=9,i=2,j=2
10 0 23 69 14 75 88 38 95 17 
  第0次搬动,middle=75,left=2,right=9,本次替换i=5,j=9
  10   0   23   69   14   17   88   38   95   75 
  第1次搬动,middle=75,left=2,right=9,本次替换i=6,j=7
  10   0   23   69   14   17   38   88   95   75 
第1次排序结果,middle=75,left=2,right=9,i=7,j=6
10 0 23 69 14 17 38 88 95 75 
  第0次搬动,middle=95,left=7,right=9,本次替换i=8,j=9
  10   0   23   69   14   17   38   88   75   95 
第2次排序结果,middle=95,left=7,right=9,i=9,j=8
10 0 23 69 14 17 38 88 75 95 
  第0次搬动,middle=88,left=7,right=8,本次替换i=7,j=8
  10   0   23   69   14   17   38   75   88   95 
第3次排序结果,middle=88,left=7,right=8,i=8,j=7
10 0 23 69 14 17 38 75 88 95 
  第0次搬动,middle=14,left=2,right=6,本次替换i=2,j=4
  10   0   14   69   23   17   38   75   88   95 
第4次排序结果,middle=14,left=2,right=6,i=3,j=3
10 0 14 69 23 17 38 75 88 95 
  第0次搬动,middle=23,left=3,right=6,本次替换i=3,j=5
  10   0   14   17   23   69   38   75   88   95 
第5次排序结果,middle=23,left=3,right=6,i=4,j=4
10 0 14 17 23 69 38 75 88 95 
  第0次搬动,middle=69,left=4,right=6,本次替换i=5,j=6
  10   0   14   17   23   38   69   75   88   95 
第6次排序结果,middle=69,left=4,right=6,i=6,j=5
10 0 14 17 23 38 69 75 88 95 
  第0次搬动,middle=23,left=4,right=5,本次替换i=4,j=4
  10   0   14   17   23   38   69   75   88   95 
第7次排序结果,middle=23,left=4,right=5,i=5,j=3
10 0 14 17 23 38 69 75 88 95 
  第0次搬动,middle=17,left=3,right=4,本次替换i=3,j=3
  10   0   14   17   23   38   69   75   88   95 
第8次排序结果,middle=17,left=3,right=4,i=4,j=2
10 0 14 17 23 38 69 75 88 95 
  第0次搬动,middle=14,left=2,right=3,本次替换i=2,j=2
  10   0   14   17   23   38   69   75   88   95 
第9次排序结果,middle=14,left=2,right=3,i=3,j=1
10 0 14 17 23 38 69 75 88 95 
  第0次搬动,middle=0,left=0,right=2,本次替换i=0,j=1
  0   10   14   17   23   38   69   75   88   95 
第10次排序结果,middle=0,left=0,right=2,i=1,j=0
0 10 14 17 23 38 69 75 88 95 
  第0次搬动,middle=10,left=1,right=2,本次替换i=1,j=1
  0   10   14   17   23   38   69   75   88   95 
第11次排序结果,middle=10,left=1,right=2,i=2,j=0
0 10 14 17 23 38 69 75 88 95 
最后数据:
0 10 14 17 23 38 69 75 88 95 

JAVA排序算法之快速排序

JAVA排序算法之快速排序基本思想:通过一趟排序将要排序的数据分割为独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分分别进行快速排序,整个排序可以用递归进行完...
  • liurongsheng123
  • liurongsheng123
  • 2017年12月31日 22:35
  • 85

java排序算法-比较快速排序,冒泡排序,双向冒泡排序的执行效率

快速排序 原理是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排...
  • twj13162380953
  • twj13162380953
  • 2016年12月28日 17:46
  • 737

Java排序算法:快速排序

[算法思想] 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的元素均比另一部分记录的元素小,然后分别对这两部分记录继续进行排序,从而达到整个序列有序的目的。 快速排序是冒泡排序的...
  • duhf_think
  • duhf_think
  • 2015年06月25日 09:08
  • 304

Java排序算法--》快速排序

快速排序是标准C++库泛型排序的默认算法:分治策略 基本思路: 1.在数组中选定一个基准值(通常选择数组首个元素---》不可取,特别是对部分预排序的数组而言,会导致算法效率低下) 2.把大数组拆分成两...
  • wwHRestarting
  • wwHRestarting
  • 2016年02月21日 14:35
  • 164

Java排序算法 快速排序

排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。下面让我们一起来看快速排序。 AD: 快速排序(Quicksort)是对冒泡排序的一种改进。它的基本...
  • hjm4702192
  • hjm4702192
  • 2012年08月02日 10:04
  • 900

JAVA排序算法---快速排序

package 备份类;public class 快速排序 { public static void main(String[] args) { int[] aa = { 6, 5...
  • hest0001
  • hest0001
  • 2016年03月11日 11:33
  • 153

Java排序算法——快速排序

快速排序
  • u013358031
  • u013358031
  • 2017年10月11日 20:32
  • 54

Java排序算法--快速排序

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个...
  • tanga842428
  • tanga842428
  • 2016年09月22日 20:47
  • 169

数据结构实验之排序八:快速排序 递归

Time Limit: 1000MS Memory Limit: 65536KB Problem Description 给定N(N≤10^5)个整数,要求用快速排序对数据进行升序排列,注意不得...
  • khn64
  • khn64
  • 2017年02月08日 19:22
  • 193

Java排序算法与优化(快速排序)

参考:/** * @类名:Test03 * @描述:快速排序,时间复杂度最差O(n^2)、平均\最好O(nlog2n),不稳定 * @时间:2018年1月11日 下午4:37:05 */public ...
  • qq_16608213
  • qq_16608213
  • 2018年02月11日 11:15
  • 6
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java排序算法之快速排序
举报原因:
原因补充:

(最多只允许输入30个字)