时间复杂度 最坏情况下O(
), 平均的复杂度为O(
)
快速排序也是一种分治的递归算法。将数组S排序的基本算法由下滤简单的四步组成:
- 如果S中元素的个数为0或者1,则返回;
- 取S中任意一元素
,称之为枢纽元(pivot)
- 将
(S中剩余元素)分成两个不想交的集合: 和
- 返回quicksort(
)后,即随
继而quicksort(
)
枢纽元的选择
- 随机选取枢纽元,利用随机数生成器,产生一个随机数充当枢纽元。
- 选取中值,
void quickSort(int *arr, int size){qSort(arr, 0, size - 1);};void qSort(int *arr, int start, int end){if (start < end){int q = partition(arr, start, end);qSort2(arr, start, q - 1);qSort2(arr, q + 1, end);}};int partition(int *arr, int start, int end){int pivot = arr[start];int i = start;for (int j = start + 1; j <= end; j++){if (arr[j] <= pivot){i++;swap(&arr[i], &arr[j]);}}swap(&arr[start], &arr[i]);return i;};
/**** @param {number[]} arr*/const quickSort = (arr) => {debugger_qs(arr, 0, arr.length - 1);}/**** @param {number[]} arr* @param {number} left* @param {number} right*/const _qs = (arr, left, right) => {if (left < right) {const idx = partition(arr, left, right);_qs(arr, left, idx - 1);_qs(arr, idx + 1, right);}}/**** @param {number[]} arr* @param {number} left* @param {number} right* @returns {number}*/const partition = (arr, left, right) => {let i = left;let j = right - 1;let mid = (left + right) >> 1let item = arr[mid];swap(arr, mid, right);while (i <= j) {while (i <= j && item > arr[i]) { i++ }while (i <= j && item < arr[j]) { j-- }if (i == j) break;if (i < j) {swap(arr, i, j)}}swap(arr, i, right);return i;}const swap = (arr, a, b) => {let t = arr[a];arr[a] = arr[b];arr[b] = t;}const arr = [50, 63, 41, 5, 9, 78, 30, 46, 84, 12, 1, 53, 63, 85, 9];// const arr = [6, 4, 2, 5, 9, 8, 3, 7]console.log(arr.join(" "));quickSort(arr);console.log(arr.join(" "));
