下面代码的一些提示:
使用数组的首元素作为轴值;
每次移动都是右指针先向左移动,直到遇到第一个比轴值小的元素 or 右指针遇到了左指针 停止; 接下来左指针向右移动,直到遇到第一个比轴值大的元素,或者遇到了右指针停止。当左右指针都停止移动时,如果两者已经相遇,则left指针(或right指针)所处的位置即为轴值应处于的正确位置,交换left指针处的值和轴值;若左右指针都停止移动时,两者尚未相遇,则交换两指针所指的值,并继续向左、向右移动(right指针向左,left指针向右),重复以上过程。
Java代码如下:
public class QuickSort { public int partition(int[]nums, int left, int right){ int begin = left; // 确定轴值 int value = nums[begin]; while(left != right ){ // 右指针向左移动,直到遇到第一个比轴值小的元素 while(nums[right] >= value && right>left ){ right --; } // 左指针向右移动,直到遇到第一个比轴值大的元素 while(nums[left] <= value && left<right){ left ++; } // 当上述移动完成后,如果left和right未相遇 if(left != right){ // 交换left和right所在位置的数 int temp = nums[left]; nums[left] = nums[right]; nums[right] = temp; } else{ // 如果上述移动完成后,left和right相遇了 // 交换left和轴值 int temp = nums[left]; nums[left] = nums[begin]; nums[begin] = temp; // left的位置就是轴值应该处于的位置 return left; } } return left; } public void Sort(int[] nums, int left, int right){ if(nums==null || nums.length <= 1){ return; } if(right-left < 1){ return; } // 确定划分位置index int index = partition(nums, left, right); // 根据划分位置index,将数组分为左右两部分,对两部分递归的进行快排 Sort(nums, left, index-1); Sort(nums, index+1, right); } public static void main(String[] args) { int[] nums = {5,62,123,7,95,55,12,12,34,46}; QuickSort quickSorter = new QuickSort(); quickSorter.Sort(nums, 0, nums.length-1); for(int i: nums){ System.out.print(i + " "); } } }