【A】排序-快速排序
上图为快速排序的排序的过程图.
快排算法中所包含的算法思想
在计算机科学中,分治法(英語:Divide and conquer)是建基於多項分支遞歸的一种很重要的算法範式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
算法思想:
- 选择Pivot中心轴
- 将小于Pivot的数字放在Pivot的左边
- 将大于Pivot的数字放在Pivot的右边
- 分别对左右子序列重复前三步操作
算法实现
/**
* 快速排序
*
* @param arr
* @param low
* @param high
*/
public static void quickSort(int[] arr, int low, int high) {
if (arr == null || arr.length < 2) {
return;
}
if (low < high) {
// pi is partitioning index, arr[p]
// is now at right place
int pi = partition(arr, low, high);
// Separately sort elements before
// partition and after partition
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
static int partition(int[] arr, int low, int high) {
// pivot
int pivot = arr[high];
// Index of smaller element and
// indicates the right position
// of pivot found so far
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
// If current element is smaller
// than the pivot
if (arr[j] < pivot) {
// Increment index of
// smaller element
i++;
SwapUtils.swap(arr, i, j);
}
}
SwapUtils.swap(arr, i + 1, high);
return (i + 1);
}
算法时间复杂度
O(nlogn)
完~