import java.util.Arrays;
public class QuicklySort {
public static void main(String[] args) {
int[] arr = {44,5,24,8,1,7,35,9,32,5,61,33};
quicklySort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
//快速排序:初始值传入 int start = 0;int end = arr.length-1;
public static void quicklySort(int[] arr,int start,int end) {
int target = searchLocation(arr,start,end); //将数组进行第一次排序,并得到之前数组中arr[0]的位置target
int target1 = searchLocation(arr,start,target-1);//将数组进行第二次排序,并得到第一次排序后数组中arr[0]的位置target1
int target2 = searchLocation(arr,target+1,end);//将数组进行第三次排序,并得到第一次排序后数组中arr[target+1]的位置target2
if (start < target1-1) {
quicklySort(arr,start,target1-1);//递归排序每次左边的元素,直到每个元素比完了就结束。
}
if (target2+1 <= end) {
quicklySort(arr,target2+1,end);//递归比较每次右边的元素,直到每个元素比完了就结束。
}
return;
}
//从数组arr中start到end的一段,找到arr[start]在该段中按照大小排序后应该所处的位置,
//并使这串数据中左边的数据比它小,右边的数据比它大,然后返回它在数组中的索引值。
public static int searchLocation(int[] arr,int start,int end) {
int target = start;
int max = end;
int min = start;
while (max>min){
for (int i = max;i>min;i--) {
if (arr[target]>arr) {
arr[target] = arr^arr[target]^(arr = arr[target]);
target = i;
break;
}
}
max = target;
min++;
for (int i = min; i<max ; i++) {
if (arr[target]<arr) {
arr[target] = arr^arr[target]^(arr = arr[target]);
target = i;
break;
}
}
min = target;
max--;
}
return target;
}
}
|
|