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 快速排序算法

  • 2015年07月21日 17:04
  • 2KB
  • 下载

快速排序算法JAVA实现

  • 2010年12月13日 16:57
  • 27KB
  • 下载

快速排序算法学习心得(Java实现)

先上代码: ​int AdjustArray(int s[], int l, int r) //返回调整后基准数的位置,传入的参数分别是:子数组,子数组的第一个数的下标,最后一个数的下标 ...

快速排序算法

  • 2015年05月01日 16:41
  • 1KB
  • 下载

两张不同的快速排序算法

  • 2013年06月09日 18:47
  • 3KB
  • 下载

快速排序算法(java)

1、算法思想     快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。 (1) 分...

快速排序算法

  • 2013年10月27日 09:58
  • 5KB
  • 下载

快速排序算法

  • 2013年08月04日 23:18
  • 2KB
  • 下载

快速排序算法-Java、Python实现

算法简介就直接套用百度百科了,感觉讲的挺清楚的,后面会具体分析一下代码。 快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1962年提出。它的基本思...
  • Belug
  • Belug
  • 2017年04月24日 21:02
  • 267

快速排序算法C 源文件

  • 2014年08月07日 16:05
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java排序算法之快速排序
举报原因:
原因补充:

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