编辑
2023-11-12
算法题
00
请注意,本文编写于 545 天前,最后修改于 545 天前,其中某些信息可能已经过时。

以下是八大排序算法的C++模板代码

cpp
#include <iostream> #include <vector> using namespace std; // 冒泡排序 template<typename T> void bubbleSort(vector<T>& arr) { int n = arr.size(); for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { swap(arr[j], arr[j + 1]); } } } } // 选择排序 template<typename T> void selectionSort(vector<T>& arr) { int n = arr.size(); for (int i = 0; i < n - 1; i++) { int minIndex = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } swap(arr[i], arr[minIndex]); } } // 插入排序 template<typename T> void insertionSort(vector<T>& arr) { int n = arr.size(); for (int i = 1; i < n; i++) { T key = arr[i]; int j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } } // 希尔排序 template<typename T> void shellSort(vector<T>& arr) { int n = arr.size(); for (int gap = n / 2; gap > 0; gap /= 2) { for (int i = gap; i < n; i++) { T temp = arr[i]; int j; for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) { arr[j] = arr[j - gap]; } arr[j] = temp; } } } // 归并排序 template<typename T> void merge(vector<T>& arr, int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid; vector<T> L(n1), R(n2); for (int i = 0; i < n1; i++) { L[i] = arr[left + i]; } for (int i = 0; i < n2; i++) { R[i] = arr[mid + 1 + i]; } int i = 0, j = 0, k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } template<typename T> void mergeSort(vector<T>& arr, int left, int right) { if (left < right) { int mid = left + (right - left) / 2; mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); merge(arr, left, mid, right); } } // 快速排序 template<typename T> int partition(vector<T>& arr, int low, int high) { T pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] < pivot) { i++; swap(arr[i], arr[j]); } } swap(arr[i + 1], arr[high]); return i + 1; } template<typename T> void quickSort(vector<T>& arr, int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } // 堆排序 template<typename T> void heapify(vector<T>& arr, int n, int i) { int largest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && arr[left] > arr[largest]) { largest = left; } if (right < n && arr[right] > arr[largest]) { largest = right; } if (largest != i) { swap(arr[i], arr[largest]); heapify(arr, n, largest); } } template<typename T> void heapSort(vector<T>& arr) { int n = arr.size(); for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } for (int i = n - 1; i >= 0; i--) { swap(arr[0], arr[i]); heapify(arr, i, 0); } } // 计数排序 template<typename T> void countingSort(vector<T>& arr) { T maxVal = *max_element(arr.begin(), arr.end()); int n = arr.size(); vector<T> output(n); vector<int> count(maxVal + 1, 0); for (int i = 0; i < n; i++) { count[arr[i]]++; } for (int i = 1; i <= maxVal; i++) { count[i] += count[i - 1]; } for (int i = n - 1; i >= 0; i--) { output[count[arr[i]] - 1] = arr[i]; count[arr[i]]--; } for (int i = 0; i < n; i++) { arr[i] = output[i]; } } int main() { // 示例用法 vector<int> arr = {9, 5, 7, 1, 3}; // 冒泡排序 bubbleSort(arr); cout << "冒泡排序结果:"; for (auto num : arr) { cout << num << " "; } cout << endl; // 选择排序 selectionSort(arr); cout << "选择排序结果:"; for (auto num : arr) { cout << num << " "; } cout << endl; // 插入排序 insertionSort(arr); cout << "插入排序结果:"; for (auto num : arr) { cout << num << " "; } cout << endl; // 希尔排序 shellSort(arr); cout << "希尔排序结果:"; for (auto num : arr) { cout << num << " "; } cout << endl; // 归并排序 mergeSort(arr, 0, arr.size() - 1); cout << "归并排序结果:"; for (auto num : arr) { cout << num << " "; } cout << endl; // 快速排序 quickSort(arr, 0, arr.size() - 1); cout << "快速排序结果:"; for (auto num : arr) { cout << num << " "; } cout << endl; // 堆排序 heapSort(arr); cout << "堆排序结果:"; for (auto num : arr) { cout << num << " "; } cout << endl; // 计数排序 countingSort(arr); cout << "计数排序结果:"; for (auto num : arr) { cout << num << " "; } cout << endl; return 0; }
  • 冒泡排序(Bubble Sort):通过相邻元素的比较和交换,每次将最大的元素冒泡到数组的末尾。

  • 选择排序(Selection Sort):每次从未排序的部分中选择最小的元素,放到已排序部分的末尾。

  • 插入排序(Insertion Sort):将未排序部分的元素逐个插入到已排序部分的合适位置。

  • 希尔排序(Shell Sort):对插入排序的改进版本,通过比较相隔一定间隔的元素进行排序,逐渐减小间隔直到为1,最后进行一次普通插入排序。

  • 归并排序(Merge Sort):将数组递归地分为两个子数组,分别进行排序,然后将两个有序的子数组归并成一个有序的数组。

  • 快速排序(Quick Sort):选择一个元素作为基准,将小于基准的元素放到基准的左边,大于基准的元素放到基准的右边,然后对左右两个子数组递归地进行快速排序。

  • 堆排序(Heap Sort):通过构建最大堆(或最小堆),将堆顶元素与最后一个元素交换,然后对剩余元素重新构建堆,重复这个过程直到所有元素都有序。

  • 计数排序(Counting Sort):适用于元素范围较小的整数排序,通过统计每个元素出现的次数,然后按照计数的顺序重新排列元素。

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!