快速排序算法实现
如果数组中没有重复元素,可以用此代码快速实现
排序数组
public static int[] quickSort(int[] arr) {
if (arr.length == 0 || null == arr) {
return arr;
}
quickSort(arr, 0, arr.length - 1);
return arr;
}
找到枢轴元素下标,然后按下标分割数组,递归排序
private static void quickSort(int[] arr, int low, int high) {
if (low >= high) {
//递归退出条件
return;
}
int pivotIndex = partition(arr, low, high);
quickSort(arr, low, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, high);
}
分割算法
private static int partition(int[] arr, int low, int high) {
int pivotEle = getPivot(arr, low, high);
int i = low;
int j = high;
for (; ; ) {
while (arr[i] < pivotEle) {
i++;//比 pivot 元素小,则直接往后移一位
}
while (arr[j] > pivotEle) {
j--;//比 pivot 元素大,则直接后前移一位
}
if (i < j) {
swap(arr, i, j);//找到:arr[i] 比 pivot 元素大,arr[j] 比 pivot 元素小,swap
} else {
break;
}
}
return i;//pivot 元素对应的 index,在这一轮排序中已经固定不变。
}
选取枢轴元素算法,按理说是选的元素越偏“中间”越好,这里直接选“最后”一个元素
private static int getPivot(int[] arr, int low, int high) {
return arr[high];
}
元素交换
private static void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}