数据结构、算法神马的实在精妙,这些年都忘得差不多了,花点时间整理整理,挺有必要的。
以下是快速排序中的两种实现,区别在于分区的方式
1.原地分区
public class QuickSort {
public static final Random RANDOM = new Random();
private static void swap(int[] array, int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
private static int partition(int[] array, int start, int end){
int index = start + RANDOM.nextInt(end - start + 1);
int pivot = array[index];
swap(array, index, end);
for(int i=index=start; i<end; i++){
if(array[i] < pivot){
swap(array, index++, i);
}
}
swap(array, index, end);
return index;
}
private static void qsort(int[] array, int start, int end){
if(end > start){
int index = partition(array, start, end);
qsort(array, start, index-1);
qsort(array, index + 1, end);
}
}
public static void sort(int[] array){
qsort(array, 0, array.length - 1);
}
}
2.
public class QuickSort_ {
public static final Random RANDOM = new Random();
private static void swap(int[] array, int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
private static int partition(int[] array, int start, int end){
int index = start + RANDOM.nextInt(end - start + 1);
int pivot = array[index];
swap(array, start, index);
while(start < end){
while(start < end && array[end] >= pivot){
end--;
}
if(start < end){
array[start++] = array[end];
}
while(start < end && array[start] <= pivot){
start++;
}
if(start < end){
array[end--] = array[start];
}
}
array[start] = pivot;
return start;
}
private static void qsort(int[] array, int start, int end){
if(end > start){
int index = partition(array, start, end);
qsort(array, start, index-1);
qsort(array, index + 1, end);
}
}
public static void sort(int[] array){
qsort(array, 0, array.length - 1);
}
}