5、归并排序
#include <vector> #include <iostream> #include <random> #include <algorithm> using namespace std; void MergeSort(vector<int> &data, vector<int> &cdata, int p, int r); void Merge(vector<int> &data, vector<int> &cdata, int p, int q, int r); void MergeSort(vector<int> &data) { vector<int> cdata(data.size()); MergeSort(data, cdata, 0, data.size() - 1); } void MergeSort(vector<int> &data, vector<int> &cdata, int p, int r) { if (p < r) { int q = (p + r) / 2; MergeSort(data, cdata, p, q); MergeSort(data, cdata, q + 1, r); Merge(data, cdata, p, q, r); } } void Merge(vector<int> &data, vector<int> &cdata, int p, int q, int r) { for (int i = p; i <= r; ++i) cdata[i] = data[i]; int i = p, j = q + 1, k = p; while (i <= q && j <= r) { if (cdata[i] <= cdata[j]) data[k++] = cdata[i++]; else data[k++] = cdata[j++]; } while (i <= q) data[k++] = cdata[i++]; while (j <= r) data[k++] = cdata[j++]; } int main(int argc, char *argv[]) { vector<int> data1 = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; vector<int> data2; default_random_engine dre(7); uniform_int_distribution<int> di(-100, 100); for (int i = 0; i < 50; ++i) data2.push_back(di(dre)); MergeSort(data1); for (auto i : data1) cout << i << " "; cout << endl; MergeSort(data2); for (auto i : data2) cout << i << " "; cout << endl; return 0; }
6、堆排序
#include <iostream> #include <vector> #include <random> using namespace std; inline int leftChild(int i) { return 2 * i + 1; } void sink(vector<int> &data, int i, int n) { int child; int tmp; for (tmp = data[i]; leftChild(i) < n; i = child) { child = leftChild(i); while (child != n - 1 && data[child] < data[child + 1]) ++child; if (data[child] > tmp) data[i] = data[child]; else break; } data[i] = tmp; } void HeapSort(vector<int> &data) { for (int i = data.size() / 2; i >= 0; --i) sink(data, i, data.size()); for (int j = data.size() - 1; j > 0; --j) { swap(data[0], data[j]); sink(data, 0, j); } } int main(int argc, char* argv[]) { vector<int> data; default_random_engine dre; uniform_int_distribution<int> di(-50, 50); for (int i = 0; i < 50; ++i) data.push_back(di(dre)); HeapSort(data); for (auto i : data) cout << i << " "; cout << endl; return 0; }
7、快速排序
#include <iostream> #include <vector> #include <random> using namespace std; void InsertionSort(vector<int> &data, int left, int right) { for (int i = left + 1; i <= right; ++i) { int tmp = data[i]; int j = i - 1; while (j >= left && data[j] > tmp) { data[j + 1] = data[j]; --j; } data[j + 1] = tmp; } } int mediant(vector<int> &data, int left, int right) { int center = (left + right) / 2; if (data[left] > data[right]) swap(data[left], data[right]); if (data[center] > data[right]) swap(data[left], data[right]); if (data[left] > data[center]) swap(data[left], data[center]); swap(data[center], data[right - 1]); return data[right - 1]; } void QuickSort(vector<int> &data, int left, int right) { if (left + 10 < right) { int pivot = mediant(data, left, right); int i = left, j = right - 1; for(;;) { while (data[++i] < pivot) {} while (data[--j] > pivot) {} if (i < j) swap(data[i], data[j]); else break; } QuickSort(data, left, i - 1); QuickSort(data, i + 1, right); } else InsertionSort(data, left, right); } void QuickSort(vector<int> &data) { QuickSort(data, 0, data.size() - 1); } int main(int argc, char *argv[]) { vector<int> data; default_random_engine dre; uniform_int_distribution<int> di(-100, 100); for (int i = 0; i < 50; ++i) data.push_back(di(dre)); QuickSort(data); for (auto i : data) cout << i << " "; cout << endl; return 0; }