/**
* 快排
*
*
*/
public class FastSort {
/**
* 两边排序
*
* @param arr
* @param start
* @param end
*/
public static void FSort(int[] arr, int start, int end) {
if (start >= end)
return;
int pos = FindPos(arr, start, end);
FSort(arr, start, pos - 1);
FSort(arr, pos + 1, end);
}
/**
* 交换arr[i]和arr[j]的位置
*
* @param arr
* @param i
* @param j
*/
public static void swap(int[] arr, int i, int j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
/**
* 按基准点排序
*
* @param arr
* @param start
* @param end
* @return
*/
public static int FindPos(int[] arr, int start, int end) {
int base = arr[start];
int i = start;
int j = end + 1;
while (true) {
while (arr[++i] < base && i < end)
;
while (arr[--j] > base)
;
if (i >= j)
break;
swap(arr, i, j);
}
arr[start] = arr[j];
arr[j] = base;
return j;
}
public static void main(String[] args) {
int[] arr = { 7, 2, 1, 20, 9, 0, 8 };
FSort(arr, 0, arr.length - 1);
for (int i : arr) {
System.out.print(i + " ");
}
}
}
public class QuickSort {
/**
* 快速排序
* 1.基准元素为第一个元素,i为第一个元素的下标,j为最后一个元素的下标
* 2.j向前找,找到比基准元素值小的,赋值给j的位置;i向后找,找到比基准元素大的值,赋值给i的位置
* 3.i>=j的时候停止,基准元素左右两边分别重复上面步骤
*/
public static int QSort(int start,int end,int[] arr){
int base=arr[start];
while(start<end){
while(arr[end]>=base&&start<end){
end--;
}
arr[start]=arr[end];
while(arr[start]<=base&&start<end){
start++;
}
arr[end]=arr[start];
}
arr[start]=base;
return start;
}
public static void EndSort(int start,int end,int[] arr){
if(start>=end){
return;
}
int position = QSort(start,end,arr);
EndSort(start, position-1, arr);
EndSort(position+1, arr.length-1, arr);
}
public static void main(String[] args) {
int arr[]={7,9,5,4,6};
EndSort(0,arr.length-1,arr);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
}