1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
| #include<iostream> #include<stack> #include<limits.h>
using namespace std;
#if 1 class QuickSort { public: void LeftToRight(int* arr, int left, int right) { int j = left - 1; int i = left; int tmp = arr[left]; while (i <= right) { if (arr[i] <= tmp) { ++j; swap(arr[i], arr[j]); } ++i; } swap(arr[left], arr[j]); if (left < j - 1) { LeftToRight(arr, left, j - 1); } if (j + 1 < right) { LeftToRight(arr, j + 1, right); } } private: int OnePartition(int* arr, int left, int right) { int tmp = arr[left]; int i = left; int j = right; while (i < j) { while (i < j && arr[j] > tmp) { --j; } arr[i] = arr[j]; while (i < j && arr[i] <= tmp) { ++i; } arr[j] = arr[i]; } arr[i] = tmp; return i; }
public: void quicksort(int* arr, int left, int right) { if (arr == nullptr || left < 0 || right < 0 || right < left) return; if (left < right) { int mid = OnePartition(arr, left, right); quicksort(arr, left, mid - 1); quicksort(arr, mid + 1, right); } } void NonRecursive(int* arr, int left, int right) { if (arr == nullptr || left < 0 || right < 0 || right < left) return; stack<std::pair<int, int>> st; st.push(std::pair<int, int>(left, right));
while (!st.empty()) { std::pair<int, int> top = st.top(); st.pop(); int mid = OnePartition(arr, top.first, top.second); if (top.first < mid - 1) { st.push(std::pair<int, int>(top.first, mid - 1)); } if (mid + 1 < top.second) { st.push(std::pair<int, int>(mid + 1, top.second)); } } } };
int main() { int arr[] = {12, 23, 56, 45, 78, 42, 12, 45, 42, 12}; int len = sizeof(arr) / sizeof(arr[0]);
QuickSort q; q.LeftToRight(arr, 0 , len - 1); for (const int& x : arr) { cout << x << " "; } return 0; }
#endif
|