核心代码
递归原理实现对轴值两侧的元素进行排序
if(nums1.length > 1) {
fastSort(nums1);
}
if(nums2.length > 1) {
fastSort(nums2);
}
源代码(未优化)
public class 快速排序 {
public static void main(String[] args) {
int nums[] = {23, 13, 35, 6, 19, 50, 28, 213, 5, 6, 3, 0, 0, 0, 0};
for(int i : fastSort(nums)) {
System.out.print(i + " ");
}
}
//
public static int[] fastSort(int nums[]) {
//左右指针,会向中间靠拢,最终会相等
int left = 0;
int right = nums.length - 1;
//左指针,右指针相等时跳出
//跳出时选定轴值已放置到正确位置,这里轴值选择的是,待排序数列左边第一个值
while(left < right) {
//右指针左移,碰到小于轴值的跳出
while(nums[left] < nums[right]) {
right--;
}
//交换轴值与 right 下标对应的元素
nums[left] = nums[right] + nums[left] - (nums[right] = nums[left]);
//左指针右移一位
left++;
//如果已经相等跳出
if(left == right) {
break;
}
//左指针右移,碰到大于轴值的跳出
while(nums[left] < nums[right]) {
left++;
}
//交换轴值与 left 下标对应的元素
nums[left] = nums[right] + nums[left] - (nums[right] = nums[left]);
//右指针左移一位
right--;
}
//新数组存放轴值两侧的,数列
int nums1[] = new int[left];
int nums2[] = new int[nums.length - right - 1];
for(int i = 0; i < nums1.length; i++) {
nums1[i] = nums[i];
}
for(int j = nums2.length - 1; j >= 0; j--) {
nums2[j] = nums[nums.length - nums2.length + j];
}
//精髓,递归,直到轴值两侧只剩一个元素,完成
if(nums1.length > 1) {
fastSort(nums1);
}
if(nums2.length > 1) {
fastSort(nums2);
}
//排序好后不断往回赋值
for(int i = 0; i < nums1.length; i++) {
nums[i] = nums1[i];
}
for(int j = nums2.length - 1; j >= 0; j--) {
nums[nums.length - nums2.length + j] = nums2[j];
}
return nums;
}
}
运行结果