手写java快排(快速排序)代码——双边循环法,本人亲测哈哈!!
package com.abc.backend.algo;
import java.util.Arrays;
public class QuickSort {
// 精髓在于,每一次传入的startIndex与endIndex都是基于递归中的“上一次”传进来的,而不是“最开始”的那两个值。
public static void func(int[] nums, int startIndex, int endIndex){
if(startIndex >= endIndex){ //注意这里是“ >= ”
return;
}
int pivotIndex = funcExt(nums, startIndex, endIndex);
func(nums, startIndex, pivotIndex-1);
func(nums, pivotIndex+1, endIndex);
}
public static int funcExt(int[] nums, int startIndex, int endIndex){
//取基准数(第一个或者随机,这里取第一个)
int pivot = nums[startIndex];
int left = startIndex;// 换个词好理解
int right = endIndex;//换个词好理解
while (left != right){
while(left != right && nums[right] > pivot){ // 循环挪指针过程中,首先保证left与right不相遇。如果相遇,则跳出循环,交换pivot与“重合数”
right--;
}
while(left != right && nums[left] <= pivot){ // 循环挪指针过程中,首先保证left与right不相遇。如果相遇,则跳出循环,交换pivot与“重合数” // 这里有个等号,因为pivot与num[left]每轮开始时都相等
left++;
}
//{
// System.out.println("交换前数组:" + Arrays.toString(nums));
// System.out.println("交换前索引:[0][1][2][3][4][5][6][7]");
// System.out.println("交换索引位:" + left + "<<<>>>" + right);
//}
if(left != right){ // left与right相遇了,就不需要自己与自己交换了,浪费资源
int t = nums[right];
nums[right]=nums[left];
nums[left]=t;
}
//{
// System.out.println("交换后数组:" + Arrays.toString(nums));
// System.out.println("==================");
//}
}
nums[startIndex]=nums[left];
nums[left]=pivot;
return left;
}
public static void main(String[] args) {
int[] nums = {4,7,3,5,6,2,8,1};
// int[] nums = {8,1};
QuickSort.func(nums, 0, nums.length-1);
System.out.println(Arrays.toString(nums));
}
}
暑期编程PK赛
得CSDN机械键盘等精美礼品!


