快速排序思想及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模板代码的主要内容,如果未能解决你的问题,请参考以下文章