关闭

Java排序算法之快速排序

标签: 快速排序quicksort
465人阅读 评论(0) 收藏 举报
分类:

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:8559次
    • 积分:167
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:2篇
    • 译文:0篇
    • 评论:1条
    文章存档