由Partition&荷兰国旗问题引出的快速排序(QuickSort)
Partition问题:
给定一个数组 a r r arr arr,和一个数 n u m num num,请把小于 n u m num num的数放在数组的左边,大于 n u m num num的数放在数组的右边。需要额外空间复杂度为 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);
}
}
}
荷兰国旗问题:
给定一个数组 a r r arr arr,和一个数 n u m num num,请把小于 n u m num num的数组放在数组的左边,等于 n u m num num的数组放在数组的中间,大于 n u m num num的数放在数组的右边。需要额外空间复杂度为 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;
}