快速排序心得
开始写的时候还真的有点不理解个东西,其实当时主要是不清楚如果i或j
走到了flag上时,假定右边的j走到flag上,i还在左半边,当其与flag值进行交换后无法确定i与j之间的数是否满足大于flag,后来发现了这道代码的意思是flag的位置是随意的,他只要满足存在一个位置(这个位置不一定是原始flag值所在的位置,也不一定是falg转换之后的位置)使得他左侧小于等于flag,右侧大于flag就行了
洛谷
import java.util.Scanner;
public class Test {
public static void sort(int p[],int l,int r){
int flag = p[(l + r) / 2];
int i = l,j = r;
while(i <= j){
while (p[i] < flag) i++;p
while (p[j] > flag) j--;
if(i <= j){
int a = p[i];
p[i] = p[j];
p[j] = a;
i++;j--;
}
}
if(l < j) sort(p,l,j);
if(r > i) sort(p,i,r);
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for(int i = 0;i < n;i++){
arr[i] = sc.nextInt();
}
sort(arr,0, n - 1);
for(int i = 0; i < n ; i++) System.out.print(arr[i] + " ");
}
}