下面代码的一些提示:
使用数组的首元素作为轴值;
每次移动都是右指针先向左移动,直到遇到第一个比轴值小的元素 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 + " ");
}
}
}