由Partition&荷兰国旗问题引出的快速排序(QuickSort)
Partition问题:
给定一个数组arrarrarr,和一个数numnumnum,请把小于numnumnum的数放在数组的左边,大于numnumnum的数放在数组的右边。需要额外空间复杂度为 O(1)O(1)O(1) ,时间复杂度O(N)O(N)O(N)。
Solution:
void swap(int arr[], int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
void partition(int arr[], int l, int r, int num) {
int less = l-1;
for (int i = l; i <= r; i++) {
if (arr[i] < num) {
swap(arr, ++less, i);
}
}
}
荷兰国旗问题:
给定一个数组arrarrarr,和一个数numnumnum,请把小于numnumnum的数组放在数组的左边,等于numnumnum的数组放在数组的中间,大于numnumnum的数放在数组的右边。需要额外空间复杂度为 O(1)O(1)O(1) ,时间复杂度O(N)O(N)O(N)。
Solution:
void swap(int arr[], int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
void partition(int arr[], int l, int r, int num) {
int less = l-1, more = r+1;
while (l < more) {
if (arr[l] < num) {
swap(arr, ++less, l++);
} else if (arr[l] > num) {
swap(arr, --more, l);
} else {
l++;
}
}
}
快速排序:
/*
* @Descripttion:
* @version:
* @Author: iDestro
* @Date: 2020-03-18 10:59:09
* @LastEditors: iDestro
* @LastEditTime: 2020-03-18 12:59:34
*/
#include <iostream>
#include <cstdlib>
#include <ctime>
#define random(a,b) (rand()%(b-a+1)+a)
using namespace std;
void swap(int arr[], int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
int* partition(int arr[], int l, int r) {
int less = l-1, more = r+1;
while (l < more) {
if (arr[l] < arr[r]) {
swap(arr, ++less, l++);
} else if (arr[l] > arr[r]) {
swap(arr, --more, l);
} else {
l++;
}
}
swap(arr, more, r);
int* res = new int[2];
res[0] = less;
res[1] = more;
return res;
}
void quick_sort(int arr[], int l, int r) {
if (l < r) {
swap(arr, random(l, r), r);
int *p = partition(arr, l, r);
quick_sort(arr, l, p[0]);
quick_sort(arr, p[1], r);
}
}
int main() {
srand((int)time(0));
int arr[] = {9, 7, 4, 42, 23, 32, 1};
quick_sort(arr, 0, 6);
for (int i: arr) {
cout << i << " ";
}
return 0;
}
本文深入探讨了快速排序算法的实现及其关键子程序——分区算法。通过解析Partition问题和荷兰国旗问题,阐述了如何在O(N)的时间复杂度内,将数组元素按特定数值进行划分。同时,详细介绍了快速排序的递归过程,包括随机基准选择和双指针分区策略。
1491

被折叠的 条评论
为什么被折叠?



