JAVA快速排序

快速排序算法

快速排序(Quicksort)是对冒泡排序的一种改进。

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

递归方法的简述请见  我之前的博文JAVA函数(方法)

对快速排序算法的了解请见快速排序算法-百度百科

 

这个算法光是无法理解的,直接上代码,追踪每一步的运行,对照每一轮的结果去理解。

public class ArrQuickSort {
    public static void main(String[] args) {

	int[] arr = new int[] { 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 };
	printfArr(arr);
	System.out.println("=============================================================");
	arrQuickSort(arr, 0, arr.length - 1);
	System.out.println("=============================================================");
	printfArr(arr);
    }

    // 快速排序
    public static void arrQuickSort(int[] arr, int left, int right) {
	if (left < right) {
	    System.out.println("\n-------------------------------------------------------------");
	    System.out.print(String.format("arrQuickSort   left=%2d, right=%2d\t", left, right));
	    printfArr(arr);
	    System.out.print(
		    String.format("p=%d\tarr[%d]:%2d\tarr[%d]:%2d\n", left - 1, left, arr[left], right, arr[right]));
	    System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");

	    int p = partition(arr, left, right);
	    arrQuickSort(arr, left, p - 1);
	    System.out.println("左边快速排序完成,开始对右面排序...");
	    arrQuickSort(arr, p + 1, right);
	}
    }

    // 快速排序数组划分
    private static int partition(int[] arr, int left, int right) {
	int x = arr[right];
	int p = left - 1;
	for (int i = left; i < right; i++) {
	    System.out.print(String.format("partition      i=%2d, p=%2d\t\t", i, p));
	    printfArr(arr);
	    if (arr[i] <= x) {
		p++;
		swap(arr, p, i);
		System.out.print(String.format("arr[%d] <=>  arr[%d] , p=%2d\t\t", i, p, p));
	    } else {
		System.out.print("\t\t\t\t\t");
	    }
	    printfArr(arr);
	    System.out.println();
	}
	swap(arr, p + 1, right);
	System.out.print("partition      last :\t\t\t");
	printfArr(arr);
	return p + 1;
    }

    // 交换数组a中的a[i]和a[j]
    private static void swap(int[] arr, int i, int j) {
	int temp = arr[i];
	arr[i] = arr[j];
	arr[j] = temp;
    }

    private static void printfArr(int[] arr) {
	// 输出数组元素开头的符号{
	System.out.print("{ ");
	for (int i = 0; i < arr.length; i++) {
	    // 中间的元素输出格式为 值,
	    // 最后一个元素后为} 前面没有,号
	    if (i < arr.length - 1) {
		System.out.print(arr[i] + ", ");
	    } else {
		// 最后一个元素输出
		System.out.print(arr[i] + " }");
	    }
	} // for
	System.out.println();
    }// void
}

运行结果如下:

{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
=============================================================

-------------------------------------------------------------
arrQuickSort   left= 0, right=11	{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
p=-1	arr[0]:24	arr[11]: 3
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

partition      i= 0, p=-1		{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
					{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }

partition      i= 1, p=-1		{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
					{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }

partition      i= 2, p=-1		{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
					{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }

partition      i= 3, p=-1		{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
					{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }

partition      i= 4, p=-1		{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
					{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }

partition      i= 5, p=-1		{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
					{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }

partition      i= 6, p=-1		{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
					{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }

partition      i= 7, p=-1		{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
					{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }

partition      i= 8, p=-1		{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
					{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }

partition      i= 9, p=-1		{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
					{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }

partition      i=10, p=-1		{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }
					{ 24, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 3 }

partition      last :			{ 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }
左边快速排序完成,开始对右面排序...

-------------------------------------------------------------
arrQuickSort   left= 1, right=11	{ 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }
p=0	arr[1]:43	arr[11]:24
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

partition      i= 1, p= 0		{ 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }
					{ 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }

partition      i= 2, p= 0		{ 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }
					{ 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }

partition      i= 3, p= 0		{ 3, 43, 35, 5, 93, 74, 25, 54, 84, 36, 66, 24 }
arr[3] <=>  arr[1] , p= 1		{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }

partition      i= 4, p= 1		{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
					{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }

partition      i= 5, p= 1		{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
					{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }

partition      i= 6, p= 1		{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
					{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }

partition      i= 7, p= 1		{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
					{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }

partition      i= 8, p= 1		{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
					{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }

partition      i= 9, p= 1		{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
					{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }

partition      i=10, p= 1		{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }
					{ 3, 5, 35, 43, 93, 74, 25, 54, 84, 36, 66, 24 }

partition      last :			{ 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
左边快速排序完成,开始对右面排序...

-------------------------------------------------------------
arrQuickSort   left= 3, right=11	{ 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
p=2	arr[3]:43	arr[11]:35
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

partition      i= 3, p= 2		{ 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
					{ 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }

partition      i= 4, p= 2		{ 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
					{ 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }

partition      i= 5, p= 2		{ 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
					{ 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }

partition      i= 6, p= 2		{ 3, 5, 24, 43, 93, 74, 25, 54, 84, 36, 66, 35 }
arr[6] <=>  arr[3] , p= 3		{ 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }

partition      i= 7, p= 3		{ 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }
					{ 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }

partition      i= 8, p= 3		{ 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }
					{ 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }

partition      i= 9, p= 3		{ 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }
					{ 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }

partition      i=10, p= 3		{ 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }
					{ 3, 5, 24, 25, 93, 74, 43, 54, 84, 36, 66, 35 }

partition      last :			{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
左边快速排序完成,开始对右面排序...

-------------------------------------------------------------
arrQuickSort   left= 5, right=11	{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
p=4	arr[5]:74	arr[11]:93
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

partition      i= 5, p= 4		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[5] <=>  arr[5] , p= 5		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }

partition      i= 6, p= 5		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[6] <=>  arr[6] , p= 6		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }

partition      i= 7, p= 6		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[7] <=>  arr[7] , p= 7		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }

partition      i= 8, p= 7		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[8] <=>  arr[8] , p= 8		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }

partition      i= 9, p= 8		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[9] <=>  arr[9] , p= 9		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }

partition      i=10, p= 9		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[10] <=>  arr[10] , p=10		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }

partition      last :			{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }

-------------------------------------------------------------
arrQuickSort   left= 5, right=10	{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
p=4	arr[5]:74	arr[10]:66
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

partition      i= 5, p= 4		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
					{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }

partition      i= 6, p= 4		{ 3, 5, 24, 25, 35, 74, 43, 54, 84, 36, 66, 93 }
arr[6] <=>  arr[5] , p= 5		{ 3, 5, 24, 25, 35, 43, 74, 54, 84, 36, 66, 93 }

partition      i= 7, p= 5		{ 3, 5, 24, 25, 35, 43, 74, 54, 84, 36, 66, 93 }
arr[7] <=>  arr[6] , p= 6		{ 3, 5, 24, 25, 35, 43, 54, 74, 84, 36, 66, 93 }

partition      i= 8, p= 6		{ 3, 5, 24, 25, 35, 43, 54, 74, 84, 36, 66, 93 }
					{ 3, 5, 24, 25, 35, 43, 54, 74, 84, 36, 66, 93 }

partition      i= 9, p= 6		{ 3, 5, 24, 25, 35, 43, 54, 74, 84, 36, 66, 93 }
arr[9] <=>  arr[7] , p= 7		{ 3, 5, 24, 25, 35, 43, 54, 36, 84, 74, 66, 93 }

partition      last :			{ 3, 5, 24, 25, 35, 43, 54, 36, 66, 74, 84, 93 }

-------------------------------------------------------------
arrQuickSort   left= 5, right= 7	{ 3, 5, 24, 25, 35, 43, 54, 36, 66, 74, 84, 93 }
p=4	arr[5]:43	arr[7]:36
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

partition      i= 5, p= 4		{ 3, 5, 24, 25, 35, 43, 54, 36, 66, 74, 84, 93 }
					{ 3, 5, 24, 25, 35, 43, 54, 36, 66, 74, 84, 93 }

partition      i= 6, p= 4		{ 3, 5, 24, 25, 35, 43, 54, 36, 66, 74, 84, 93 }
					{ 3, 5, 24, 25, 35, 43, 54, 36, 66, 74, 84, 93 }

partition      last :			{ 3, 5, 24, 25, 35, 36, 54, 43, 66, 74, 84, 93 }
左边快速排序完成,开始对右面排序...

-------------------------------------------------------------
arrQuickSort   left= 6, right= 7	{ 3, 5, 24, 25, 35, 36, 54, 43, 66, 74, 84, 93 }
p=5	arr[6]:54	arr[7]:43
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

partition      i= 6, p= 5		{ 3, 5, 24, 25, 35, 36, 54, 43, 66, 74, 84, 93 }
					{ 3, 5, 24, 25, 35, 36, 54, 43, 66, 74, 84, 93 }

partition      last :			{ 3, 5, 24, 25, 35, 36, 43, 54, 66, 74, 84, 93 }
左边快速排序完成,开始对右面排序...
左边快速排序完成,开始对右面排序...

-------------------------------------------------------------
arrQuickSort   left= 9, right=10	{ 3, 5, 24, 25, 35, 36, 43, 54, 66, 74, 84, 93 }
p=8	arr[9]:74	arr[10]:84
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

partition      i= 9, p= 8		{ 3, 5, 24, 25, 35, 36, 43, 54, 66, 74, 84, 93 }
arr[9] <=>  arr[9] , p= 9		{ 3, 5, 24, 25, 35, 36, 43, 54, 66, 74, 84, 93 }

partition      last :			{ 3, 5, 24, 25, 35, 36, 43, 54, 66, 74, 84, 93 }
左边快速排序完成,开始对右面排序...
左边快速排序完成,开始对右面排序...
=============================================================
{ 3, 5, 24, 25, 35, 36, 43, 54, 66, 74, 84, 93 }

运行结果里面写的还算是比较清除的,有啥问题可以评论留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漠诽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值