快速排序代码讲解
1. 导入必要的包
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;
BufferedReader
和 InputStreamReader
用于从标准输入读取数据(为什么不用Scanner,因为慢啊!!!!!!).Random
用于生成随机数,以随机选择基准值.
2. 主类和主函数
public class Main {
private static Random r = new Random();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
String[] strs = br.readLine().split(" ");
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(strs[i]);
}
long start = System.currentTimeMillis();
solution(arr);
System.out.println("总用时:" + (System.currentTimeMillis() - start) + "ms");
for (int i : arr) {
System.out.print(i + " ");
}
br.close();
}
}
- 数据输入:从标准输入读取数组长度
n
和数组元素,存储到数组 arr
中. - 排序和计时:调用
solution
函数进行快速排序,并记录排序所用的时间. - 结果输出:输出排序后的数组和总用时.
3. 排序函数 solution
private static void solution(int[] arr) {
int len = arr.length;
quickSort(arr, 0, len - 1);
}
- 调用
quickSort
函数对数组进行快速排序,传入数组、起始索引 0
和结束索引 len - 1
.
4. 快速排序函数 quickSort
private static void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int i = left - 1;
int j = right + 1;
int x = arr[left + r.nextInt(right - left)];
while (i < j) {
while (arr[++i] < x);
while (arr[--j] > x);
if (i < j) {
swap(arr, i, j);
}
}
if (i == j) {
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
} else {
quickSort(arr, left, i - 1);
quickSort(arr, i, right);
}
}
- 基准值选择:这里选择了随机选择基准值的方式,以避免极端情况下的性能退化.
- 分区操作:使用双指针
i
和 j
进行分区,i
从左向右移动,j
从右向左移动,直到 i
和 j
相遇. - 递归排序:根据
i
和 j
的位置,递归地对左右两部分进行排序.
5. 交换函数 swap
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
完整代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;
public class Main {
private static Random r = new Random();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[] arr = new int[n];
String[] strs = br.readLine().split(" ");
for(int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(strs[i]);
}
long start = System.currentTimeMillis();
solution(arr);
System.out.println("总用时:"+(System.currentTimeMillis() - start)+"ms");
for(int i : arr) {
System.out.print(i + " ");
}
br.close();
}
private static void solution(int[] arr) {
int len = arr.length;
quickSort(arr,0,len-1);
}
private static void quickSort(int[] arr, int left, int right) {
if(left >= right) {
return;
}
int i = left - 1;
int j = right + 1;
int x = arr[left + r.nextInt(right - left)];
while(i < j) {
while(arr[++i] < x);
while(arr[--j] > x);
if(i < j) {
swap(arr,i,j);
}
}
if(i == j) {
quickSort(arr,left,i-1);
quickSort(arr,i+1,right);
}else {
quickSort(arr, left, i-1);
quickSort(arr, i, right);
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}