快速排序思想及java模板代码

Posted 知道什么是码怪吗?

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序思想及java模板代码相关的知识,希望对你有一定的参考价值。

 快速排序思想:

每次遍历选取一个中间值,通过一趟遍历将要排序的数组分成两部分,左部分大于等于中间值,右部分小于等于中间值,然后按照相同的方法对左右部分再进行相同的步骤。

例如:对于一组数          

10 ,5 ,737 ,23 ,2 ,11 ,99 ,167

以第一个数 10 作为中间值。左指针从头一直移动到大于中间值的那个数的下标位置,也就是737,然后右指针从尾移动到小于中间值的那个数的下标位置,也就是2。然后交换这两个数

10 ,5 ,2 ,23 ,737 ,11 ,99 ,167

但是这个时候左右指针还没有相遇,左指针走到了23,23大于中间值10,在这里暂停。右指针一直移动到2,此时,右指针的下标小于了左指针,退出最外层的while循环。此时已经分成了两部分。

{ 10 ,5 ,2(左指针 j 位置)} ,{ 23(右指针 i 位置),737 ,11 ,99 ,167 }

然后再对左右两部分递归进行相同的过程。只要退出条件设定正确,最终总会全部出栈,此时已经排好序了。

下面这个图也很清晰明了。

快速排序模板代码:

package arithmetic;

//快速排序模板代码
//快速排序是不稳定的
public class QuickSort {

	public static void quick_sort(int nums[], int left, int right) {
		// 如果传过来的数组范围的两个下标的left>=right
		// 说明了这个数组的只有1个数,不需要排序
		if (left >= right)
			return;
		int i = left - 1;// 左边的下标
		int j = right + 1;// 右边的下标
		int number = nums[left];// 每次都取数组最左边的值作为中间值
		while (i < j) {
			/*
			 * 为什么while循环前要先i++ j--,如果nums[i]==number,那么下面的while循环不会执行
			 * while循环不执行,左边的下标一直不动,无法将数组分成一半大于number 一半小于number的情况。
			 */
            i++;// 每次进入循环先将左边的下标右移一位
			while (nums[i] < number)
				i++;

			j--;// 同理
			while (nums[j] > number)
				j--;

			if (i < j) {// 经过上面两个while循环,找到了左边大于number的第一个数和右边小于number的第一个数
				int temp = nums[i];// 交换两数的值,然后再次进入最外层的while循环。
				nums[i] = nums[j];
				nums[j] = temp;
			}
		}
		// 当最外层的while循环i>=j,说明已经按照number的大小,分为了两部分
		// 左边部分<=number,右边部分>=number
		// 对分成的左边部分进行排序
		quick_sort(nums, left, j);
		// 对分成的右边部分进行排序
		quick_sort(nums, j + 1, right);
	}

	public static void main(String args[]) {

		int[] nums = { 1, 5, 6, 3, 2, 3, 7, 8, 2, 211, 58, 346, 999, 167, 1612 };
		quick_sort(nums, 0, nums.length - 1);
		for (int i : nums) {
			System.out.print(i + " ");
		}
	}
}

以上是关于快速排序思想及java模板代码的主要内容,如果未能解决你的问题,请参考以下文章

交换排序(冒泡排序快速排序的算法思想及代码实现)

Java快速排序

Java快速排序

Java快速排序

C语言快速排序算法及代码

快速排序Java代码简洁实现