快速排序思想:
每次遍历选取一个中间值,通过一趟遍历将要排序的数组分成两部分,左部分大于等于中间值,右部分小于等于中间值,然后按照相同的方法对左右部分再进行相同的步骤。
例如:对于一组数
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) { 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 + " "); } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)