#include<stdio.h> #include<stdlib.h> #include<time.h> using namespace std; void swap(int *a, int i, int j) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } int partition(int *a, int p, int r) { //主元随机化 srand(time(NULL)); int num = rand() % (r - p + 1) + p; swap(a, num, r); int x = a[r], i = p - 1; for (int j = p; j < r;++j) if (a[j] < x){ ++i; swap(a, i, j); } swap(a, i + 1, r); return i + 1; } void quickSort(int *a, int p, int r) { if (p < r){ int q = partition(a, p, r); quickSort(a, p, q - 1); quickSort(a, q + 1, r); } } typedef struct _interval{ int a, b; }interval; void intervalSwap(interval &x, interval &y) { interval tmp = x; x = y; y = tmp; } int max(int a, int b) { return a>b ? a : b; } int min(int a, int b) { return a < b ? a : b; } void fuzzyPartition(interval *a, int p, int r, int &x, int &y) { interval mid = a[r]; int i, j; i = p - 1; j = r + 1; for (int k = p; k < j; ++k){ if (a[k].b < mid.a){ ++i; intervalSwap(a[k], a[i]); } else if (a[k].a > mid.b){ --j; intervalSwap(a[k], a[j]); --k; } else{ mid.a = max(mid.a, a[k].a); mid.b = min(mid.b, a[k].b); } } x = i; y = j; } void fuzzyQuickSort(interval *a, int p, int r) { if (p < r){ int x, y; fuzzyPartition(a, p, r, x, y); fuzzyQuickSort(a, p, x); fuzzyQuickSort(a, y, r); } } int main() { int a[30]; srand(time(NULL)); for (int i = 0; i < 30; ++i) a[i] = rand() % 1000; quickSort(a, 0, 30 - 1); for (int i = 0; i < 30; ++i) printf("%d\t", a[i]); const int cnt = 5; interval r[cnt]; for (int i = 0; i < cnt; ++i){ r[i].a = rand() % 100; r[i].b = rand() % 1000+100; } fuzzyQuickSort(r, 0, cnt - 1); for (int i = 0; i < cnt; ++i){ printf("%d\t%d\n", r[i].a, r[i].b); } }
O(n2) O(nlgn) O(nlgn) O(nlgn)
时间: 2024-11-08 20:59:29