在计算机科学中,快速选择(Quickselect)是一种从无序列表找到第 k 小元素的选择算法。它从原理上来说与快速排序有关。与快速排序一样都由托尼·霍尔提出的,因而也被称为霍尔选择算法。同样地,它在实际应用是一种高效的算法,具有很好的平均时间复杂度,然而最坏时间复杂度则不理想。快速选择及其变种是实际应用中最常使用的高效选择算法。
intpartition(int *arr, int left, int right) { int base = arr[left]; //以arr[left]作为划分基准 while (left < right) { while (left < right && arr[right] >= base) right--; arr[left] = arr[right]; while (left < right && arr[left] <= base) left++; arr[right] = arr[left]; } arr[left] = base; return left; }
intquickSelect(int *arr, int n, int k) { int left = 0, right = n - 1; while (left <= right) { int idx = partition(arr, left, right); if ((k - 1) == idx) return idx; if ((k - 1) > idx) left = idx + 1; else right = idx - 1; } return-1; }
voidswap(int *arr, int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; }
intpartition(int *arr, int left, int right) { int j = left - 1; for (int i = left; i < right; i++) { if (arr[i] <= arr[right]) swap(arr, i, ++j); } swap(arr, ++j, right); return j; }
intquickSelect(int *arr, int left, int right, int k) { if (left <= right) { int idx = partition(arr, left, right); if ((k - 1) == idx) return idx; if ((k - 1) > idx) return quickSelect(arr, idx + 1, right, k); elsereturn quickSelect(arr, left, idx - 1, k); } return-1; }