目录
先上结论:


- #include
- #include
- #include
- using namespace std;
-
- void bubbleSort(vector<int> &v)
- {
-
- for (int i = 0; i < v.size() - 1; i++)
- {
- for (int j = 0; j < v.size() - i - 1; j++)
- {
- if (v[j] > v[j + 1])
- {
- swap(v[j], v[j + 1]);
- }
- }
- }
- }
-
- int main()
- {
-
- vector<int> v = {10, 8, 2, 3, 1, 6, 7, 5, 4, 9};
- bubbleSort(v);
-
- for (auto i : v)
- {
- cout << i << endl;
- }
-
- system("pause");
- return 0;
- }

-
- void selectionSort(vector<int> &arr)
- {
- int n = arr.size();
- int min_index; //最小值对应的index;
-
- for (int i = 0; i < arr.size(); i++)
- {
- min_index = i; //默认最小值对应的起始索引是当前位置
- for (int j = i; j < arr.size(); j++)
- {
-
- if (arr[j] < arr[min_index])
- {
- min_index = j;
- }
- }
- swap(arr[i], arr[min_index]);
- }
- }
- // 插入排序函数
- void insertionSort(vector<int> &arr)
- {
- int n = arr.size();
- for (int i = 1; i < n; ++i)
- {
- int key = arr[i];
- int j = i - 1;
-
- // 将大于key的元素向后移动
- while (j >= 0 && arr[j] > key)
- {
- arr[j + 1] = arr[j];
- j = j - 1;
- }
-
- // 插入key到正确的位置
- arr[j + 1] = key;
- }
- }

- void shellSort(vector<int> &arr)
- {
- int n = arr.size();
-
- // 使用一组增量进行排序
- for (int gap = n / 2; gap > 0; gap /= 2)
- {
- // 对每个增量进行插入排序
- for (int i = gap; i < n; i++)
- {
- int temp = arr[i];
- int j;
-
- // 将元素插入到正确的位置
- for (j = i; j >= gap && arr[j - gap] > temp; j -= gap)
- {
- arr[j] = arr[j - gap];
- }
-
- arr[j] = temp;
- }
- }
- }

- // 根据基准元素将数组分成两部分,并返回基准元素的索引
- int partition(vector<int> &arr, int low, int high)
- {
-
- int pivot = arr[high]; //选择最后一个作为基准
- // 初始化较小元素的索引
-
- //递归里面的low 不一定是0开始的所以,写成0 一定报错
- int index = low;
-
- for (int j = low; j <= high - 1; j++)
- {
-
- if (arr[j] <= pivot)
- {
-
- swap(arr[j], arr[index]);
- index++;
- }
- }
- // 最后交换arr[i+1]和arr[high],将基准元素放在正确的位置
- swap(arr[index], arr[high]);
- return index;
- }
-
- void quickSort(vector<int> &arr, int low, int high)
- {
-
- if (low < high) //[0,0 ]就不在判断了。
- {
-
- // 获取基准元素的索引
- int pivotIndex = partition(arr, low, high);
-
- // 对基准元素的左边和右边子数组进行递归排序
- quickSort(arr, low, pivotIndex - 1);
- quickSort(arr, pivotIndex + 1, high);
- }
- }

- #include
- #include
-
- // 合并两个已排序的子数组
- void merge(std::vector<int>& arr, int left, int mid, int right) {
- int n1 = mid - left + 1;
- int n2 = right - mid;
-
- // 创建临时数组来存储两个子数组
- std::vector<int> leftArr(n1);
- std::vector<int> rightArr(n2);
-
- // 将数据复制到临时数组中
- for (int i = 0; i < n1; i++) {
- leftArr[i] = arr[left + i];
- }
- for (int i = 0; i < n2; i++) {
- rightArr[i] = arr[mid + 1 + i];
- }
-
- // 合并两个子数组
- int i = 0, j = 0, k = left;
- while (i < n1 && j < n2) {
- if (leftArr[i] <= rightArr[j]) {
- arr[k] = leftArr[i];
- i++;
- } else {
- arr[k] = rightArr[j];
- j++;
- }
- k++;
- }
-
- // 处理剩余的元素(如果有)
- while (i < n1) {
- arr[k] = leftArr[i];
- i++;
- k++;
- }
- while (j < n2) {
- arr[k] = rightArr[j];
- j++;
- k++;
- }
- }
-
- // 归并排序函数
- void mergeSort(std::vector<int>& 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);
- }
- }
-
- int main() {
- std::vector<int> arr = {12, 11, 13, 5, 6, 7};
-
- std::cout << "原始数组: ";
- for (int num : arr) {
- std::cout << num << " ";
- }
- std::cout << std::endl;
-
- // 调用归并排序函数
- mergeSort(arr, 0, arr.size() - 1);
-
- std::cout << "排序后数组: ";
- for (int num : arr) {
- std::cout << num << " ";
- }
- std::cout << std::endl;
-
- return 0;
- }

实现:
- #include
- #include
-
- void countingSort(std::vector<int>& arr) {
- int max_val = *std::max_element(arr.begin(), arr.end()); // 找到数组中的最大值
- int min_val = *std::min_element(arr.begin(), arr.end()); // 找到数组中的最小值
-
- int range = max_val - min_val + 1; // 计算数值范围
-
- // 创建计数数组并初始化为0
- std::vector<int> count(range, 0);
-
- // 计算每个元素的出现次数
- for (int num : arr) {
- count[num - min_val]++;
- }
-
- // 根据计数数组,重建原始数组
- int index = 0;
- for (int i = 0; i < range; i++) {
- while (count[i] > 0) {
- arr[index] = i + min_val;
- index++;
- count[i]--;
- }
- }
- }
-
- int main() {
- std::vector<int> arr = {4, 2, 2, 8, 3, 3, 1};
-
- std::cout << "原始数组: ";
- for (int num : arr) {
- std::cout << num << " ";
- }
- std::cout << std::endl;
-
- // 调用计数排序函数
- countingSort(arr);
-
- std::cout << "排序后数组: ";
- for (int num : arr) {
- std::cout << num << " ";
- }
- std::cout << std::endl;
-
- return 0;
- }