算法步骤
- 从数列中挑出一个元素,称为 “基准”(pivot)
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
代码实现
调用quickSort方法,将数组,数组首位序列,数组末尾序列传入该方法
public int[] sort(int[] sourceArray) throws Exception {
//对 arr 进行拷贝,不改变参数内容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
return quickSort(arr, 0, arr.length - 1);
}
不停的迭代partition方法,直至分区长度为1
private int[] quickSort(int[] arr, int left, int right) {
if(left < right) {
int partitionIndex = partition(arr, left, right);
quickSort(arr, left, partitionIndex - 1);
quickSort(arr, partitionIndex + 1,right);
}
return arr;
}
在arr数组中,以left为基准值,right为分区排序的长度,将小于left的数值放在其左侧,大于left的数值放在其右侧
private int partition(int[] arr, int left, int right) {
//设定基准值(pivot)
int pivot = left;
int index = pivot + 1;
for(int i = index; i<=right; i++) {
if(arr[i] < arr[pivot]) {
swap(arr, i, index);
index++;
}
}
swap(arr, pivot, index - 1);
return index - 1;
}
将数组arr中,序列为i和序列为j的两个数交换
private void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
主方法,验证代码是否正确
public static void main(String[] args) throws Exception {
int[] arr = {50,15,56,23,54,84,58,45,21};
QuickSort qs = new QuickSort();
int[] result = qs.sort(arr);
System.out.print("排序后的数组为:");
for(int num:result) {
System.out.print(num+" ");
}
}