voidinitArr(int arr[], int length){ for (int i = 0; i < length; i++) { arr[i] = std::rand() % 20; } }
voidshowArr(int arr[], int length){ for (int i = 0; i < length; i++) { std::cout << arr[i] << " "; } std::cout << std::endl; }
voidselectSort(int arr[], int length){ for (int i = 0; i < length; ++i) { int k = i; for (int j = i + 1; j < length; ++j) { if (arr[j] < arr[k]) { k = j; } } std::swap(arr[i], arr[k]); } } intmain(){ std::srand(static_cast<unsignedint>(std::time(nullptr))); int arr[MAXSIZE]; initArr(arr, MAXSIZE); showArr(arr, MAXSIZE); selectSort(arr, MAXSIZE); showArr(arr, MAXSIZE); system("pause"); return0; }
1 2 3 4 5 6 7 8 9 10 11 12
选择排序 voidselectSort(int arr[], int length){ for (int i = 0; i < length; ++i) { int k = i; for (int j = i + 1; j < length; ++j) { if (arr[j] < arr[k]) { k = j; } } std::swap(arr[i], arr[k]); } }
voidinitArr(int arr[], int length){ for (int i = 0; i < length; i++) { arr[i] = std::rand() % 20; } }
voidshowArr(int arr[], int length){ for (int i = 0; i < length; i++) { std::cout << arr[i] << " "; } std::cout << std::endl; }
voidquickSort(int arr[], int left, int right){ if (left >= right) return; int i = left; int j = right; int pivot = arr[left]; // Choose leftmost element as pivot while (i < j) { while (i < j && arr[j] >= pivot) --j; if (i < j) arr[i++] = arr[j]; while (i < j && arr[i] <= pivot) ++i; if (i < j) arr[j--] = arr[i]; } arr[i] = pivot; quickSort(arr, left, i - 1); quickSort(arr, i + 1, right); }
voidquickSort(int arr[], int left, int right){ if (left >= right) return; int i = left; int j = right; int pivot = arr[left]; // Choose leftmost element as pivot while (i < j) { while (i < j && arr[j] >= pivot) --j; if (i < j) arr[i++] = arr[j]; while (i < j && arr[i] <= pivot) ++i; if (i < j) arr[j--] = arr[i]; } arr[i] = pivot; quickSort(arr, left, i - 1); quickSort(arr, i + 1, right); }
voidinitVector(std::vector<int>& vec, int length){ for (int i = 0; i < length; i++) { vec.push_back(std::rand() % 20); } }
voidshowVector(const std::vector<int>& vec){ for (int num : vec) { std::cout << num << " "; } std::cout << std::endl; }
voidmergeSort(const std::vector<int>& a, const std::vector<int>& b, std::vector<int>& temp){ int i = 0; int j = 0; int k = 0; int alen = a.size(); int blen = b.size(); while (i < alen && j < blen) temp[k++] = a[i] < b[j] ? a[i++] : b[j++]; while (i < alen) temp[k++] = a[i++]; while (j < blen) temp[k++] = b[j++]; }
intmain(){ std::vector<int> a = {1, 3, 5, 7, 9}; std::vector<int> b = {2, 8, 10}; std::vector<int> temp(a.size() + b.size());
mergeSort(a, b, temp); showVector(temp);
system("pause"); return0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14
归并排序 voidmergeSort(const std::vector<int>& a, const std::vector<int>& b, std::vector<int>& temp){ int i = 0; int j = 0; int k = 0; int alen = a.size(); int blen = b.size(); while (i < alen && j < blen) temp[k++] = a[i] < b[j] ? a[i++] : b[j++]; while (i < alen) temp[k++] = a[i++]; while (j < blen) temp[k++] = b[j++]; }
voidinitArr(std::vector<int>& arr){ std::srand(static_cast<unsignedint>(std::time(nullptr))); for (int i = 0; i < arr.size(); i++) { arr[i] = std::rand() % 20; } }
voidshowArr(const std::vector<int>& arr){ for (int i = 0; i < arr.size(); i++) { std::cout << arr[i] << " "; } std::cout << std::endl; }
voidmerge(std::vector<int>& arr, int low, int mid, int high, std::vector<int>& temp){ int i = low; int j = mid + 1; int k = low; while (i <= mid && j <= high) temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++]; while (i <= mid) temp[k++] = arr[i++]; while (j <= high) temp[k++] = arr[j++]; for (i = low; i <= high; i++) arr[i] = temp[i]; }
voidmerge_sort(std::vector<int>& arr, int low, int high, std::vector<int>& temp){ if (low >= high) return; int mid = low + (high - low) / 2; merge_sort(arr, low, mid, temp); merge_sort(arr, mid + 1, high, temp); merge(arr, low, mid, high, temp); }
归并排序 voidmerge(std::vector<int>& arr, int low, int mid, int high, std::vector<int>& temp){ int i = low; int j = mid + 1; int k = low; while (i <= mid && j <= high) temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++]; while (i <= mid) temp[k++] = arr[i++]; while (j <= high) temp[k++] = arr[j++]; for (i = low; i <= high; i++) arr[i] = temp[i]; }
voidmerge_sort(std::vector<int>& arr, int low, int high, std::vector<int>& temp){ if (low >= high) return; int mid = low + (high - low) / 2; merge_sort(arr, low, mid, temp); merge_sort(arr, mid + 1, high, temp); merge(arr, low, mid, high, temp); }
voidswap(int& a, int& b){ int temp = a; a = b; b = temp; }
voidpushHeap(Heap* heap, int data) { int current = heap->length++; int parent = current / 2; heap->root[current] = data; while (parent != current) { if (heap->root[current] < heap->root[parent]) { swap(heap->root[current], heap->root[parent]); current = parent; parent = current / 2; } else break; } }
intpopHeap(Heap* heap) { int val = heap->root[0]; int current = 0; int rchild = 2 * current + 2; int small; int n = --heap->length; heap->root[0] = heap->root[heap->length]; while (rchild <= heap->length) { small = heap->root[rchild - 1] < heap->root[rchild] ? rchild - 1 : rchild; if (heap->root[small] < heap->root[current]) { swap(heap->root[small], heap->root[current]); current = small; rchild = 2 * current + 2; } else break; } return val; }
voidheapSort(std::vector<int>& arr) { Heap* heap = createHeap(arr.size()); for (int i = 0; i < arr.size(); i++) { pushHeap(heap, arr[i]); }
for (int i = 0; i < arr.size(); i++) { arr[i] = popHeap(heap); }
//入堆 voidpushHeap(Heap* heap, int data) { int current = heap->length++; int parent = current / 2; heap->root[current] = data; while (parent != current) { if (heap->root[current] < heap->root[parent]) { swap(heap->root[current], heap->root[parent]); current = parent; parent = current / 2; } else break; } }
//出堆 intpopHeap(Heap* heap) { int val = heap->root[0]; int current = 0; int rchild = 2 * current + 2; int small; int n = --heap->length; heap->root[0] = heap->root[heap->length]; while (rchild <= heap->length) { small = heap->root[rchild - 1] < heap->root[rchild] ? rchild - 1 : rchild; if (heap->root[small] < heap->root[current]) { swap(heap->root[small], heap->root[current]); current = small; rchild = 2 * current + 2; } else break; } return val; }
voidheapSort(std::vector<int>& arr) { Heap* heap = createHeap(arr.size()); for (int i = 0; i < arr.size(); i++) { pushHeap(heap, arr[i]); }
for (int i = 0; i < arr.size(); i++) { arr[i] = popHeap(heap); }