标准版,每次确定一个元素位置
public class leet832__1 {
public static void main(String[] args) {
int[] a= {2,1,33,5,43,222,3,12};
quickSort(a,0,a.length-1);
for(int i:a) {
System.out.println(i);
}
}
public static void quickSort(int[] a,int low,int high) {
if(low<high) {//这个条件千万不要忘,我总是忘
int temp=position(a,low,high);
quickSort(a,low,temp-1);
quickSort(a,temp+1,high);
}
}
public static int position(int[] a,int low,int high) {
int jizhun=a[low];
while(low<high) {
while(low<high&&a[high]>jizhun) {
high--;
}
swap(a,low,high);
while(low<high&&a[low]<=jizhun) {
low++;
}
swap(a,low,high);
}
a[low]=jizhun;
return low;
}
public static void swap(int[] a,int low,int high) {
int temp=a[low];
a[low]=a[high];
a[high]=temp;
}
}
改进版,每次确定一些相等的元素位置
public class Leetcode160 {
public static void main(String[] args) {
int[] a= {2,1,33,5,43,222,3,12};
quickSort(a,0,a.length-1);
for(int i:a) {
System.out.println(i);
}
}
public static void quickSort(int[] arr, int l, int r) {
if (l < r) {
int[] p = partition(arr, l, r);
quickSort(arr, l, p[0] - 1);
quickSort(arr, p[1] + 1, r);
}
}
public static int[] partition(int[] arr,int l,int r) {
int low=l-1;
int cur=l;
while(cur<=r) {//和左神不一样,我这个必须有等号,因为最后一个元素可能没放对。
if(arr[cur]<arr[l]) {
swap(arr,++low,cur++);
}else if(arr[cur]>arr[l]) {
swap(arr,cur,l);
}else {
cur++;
}
}
return new int[] {low+1,l};
}
public static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
如果再改进,就是随机快排,就一句花,生成一个随机位置于第一项换