当前位置:   article > 正文

十大排序C++版本代码,带注释_c++代码大全及注解

c++代码大全及注解

冒泡排序(Bubble Sort)

  1. void bubble_sort(int arr[], int n) {
  2. for (int i = 0; i < n - 1; ++i) { // 外层循环控制排序轮数
  3. bool flag = false; // 标志变量,用于优化排序
  4. for (int j = 0; j < n - i - 1; ++j) { // 内层循环控制每轮比较次数
  5. if (arr[j] > arr[j + 1]) {
  6. std::swap(arr[j], arr[j + 1]);
  7. flag = true;
  8. }
  9. }
  10. if (!flag) { // 如果本轮没有交换任何元素,则数组已有序
  11. break;
  12. }
  13. }
  14. }

选择排序(Selection Sort)

  1. void selection_sort(int arr[], int n) {
  2. for (int i = 0; i < n - 1; ++i) { // 外层循环控制排序轮数
  3. int min_idx = i; // 记录最小值的下标
  4. for (int j = i + 1; j < n; ++j) { // 内层循环寻找最小值
  5. if (arr[j] < arr[min_idx]) {
  6. min_idx = j;
  7. }
  8. }
  9. std::swap(arr[i], arr[min_idx]); // 将最小值交换到数组最前面
  10. }
  11. }

插入排序(Insertion Sort)

  1. void insertion_sort(int arr[], int n) {
  2. for (int i = 1; i < n; ++i) { // 外层循环控制待插入的元素
  3. int temp = arr[i]; // 保存待插入元素的值
  4. int j = i - 1;
  5. while (j >= 0 && arr[j] > temp) { // 内层循环寻找插入位置
  6. arr[j + 1] = arr[j];
  7. --j;
  8. }
  9. arr[j + 1] = temp; // 将待插入元素插入到正确的位置
  10. }
  11. }

希尔排序(Shell Sort)

  1. void shell_sort(int arr[], int n) {
  2. for (int gap = n / 2; gap > 0; gap /= 2) { // 增量序列的选择方法是希尔排序的关键
  3. for (int i = gap; i < n; ++i) { // 对每个子序列进行插入排序
  4. int temp = arr[i];
  5. int j = i - gap;
  6. while (j >= 0 && arr[j] > temp) {
  7. arr[j + gap] = arr[j];
  8. j -= gap;
  9. }
  10. arr[j + gap] = temp;
  11. }
  12. }
  13. }

归并排序(Merge Sort)

  1. void merge(int arr[], int left, int mid, int right) {
  2. int n1 = mid - left + 1;
  3. int n2 = right - mid;
  4. int L[n1],
  5. int R[n2];
  6. for (int i = 0; i < n1; ++i) {
  7. L[i] = arr[left + i];
  8. }
  9. for (int i = 0; i < n2; ++i) {
  10. R[i] = arr[mid + 1 + i];
  11. }
  12. int i = 0, j = 0, k = left;
  13. while (i < n1 && j < n2) { // 归并两个有序子序列
  14. if (L[i] <= R[j]) {
  15. arr[k] = L[i];
  16. ++i;
  17. } else {
  18. arr[k] = R[j];
  19. ++j;
  20. }
  21. ++k;
  22. }
  23. while (i < n1) { // 将剩余的元素插入到数组
  24. arr[k] = L[i];
  25. ++i;
  26. ++k;
  27. }
  28. while (j < n2) {
  29. arr[k] = R[j];
  30. ++j;
  31. ++k;
  32. }
  33. }
  34. void merge_sort(int arr[], int left, int right) {
  35. if (left < right) { // 递归结束条件
  36. int mid = left + (right - left) / 2;
  37. merge_sort(arr, left, mid); // 对左半边进行归并排序
  38. merge_sort(arr, mid + 1, right); // 对右半边进行归并排序
  39. merge(arr, left, mid, right); // 合并两个有序子序列
  40. }
  41. }

快速排序(Quick Sort)

  1. int partition(int arr[], int left, int right) {
  2. int pivot = arr[right]; // 选取基准元素
  3. int i = left - 1; // i 指向小于等于基准元素的区域的右边界
  4. for (int j = left; j < right; ++j) { // 遍历区域
  5. if (arr[j] <= pivot) { // 小于等于基准元素的元素放到区域左侧
  6. ++i;
  7. std::swap(arr[i], arr[j]);
  8. }
  9. }
  10. std::swap(arr[i + 1], arr[right]); // 将基准元素放到区域中间
  11. return i + 1; // 返回基准元素的下标
  12. }
  13. void quick_sort(int arr[], int left, int right) {
  14. if (left < right) { // 递归结束条件
  15. int pivot_idx = partition(arr, left, right); // 分区并返回基准元素的下标
  16. quick_sort(arr, left, pivot_idx - 1); // 对左半边进行快速排序
  17. quick_sort(arr, pivot_idx + 1, right); // 对右半边进行快速排序
  18. }
  19. }

堆排序(Heap Sort)

  1. void heapify(int arr[], int n, int i) {
  2. int largest = i; // 假设最大值在根节点
  3. int left = 2 * i
  4. int right = 2 * i + 2;
  5. // 如果左子节点比根节点大,更新最大值
  6. if (left < n && arr[left] > arr[largest]) {
  7. largest = left;
  8. }
  9. // 如果右子节点比根节点大,更新最大值
  10. if (right < n && arr[right] > arr[largest]) {
  11. largest = right;
  12. }
  13. if (largest != i) { // 如果最大值不在根节点
  14. std::swap(arr[i], arr[largest]); // 将最大值交换到根节点
  15. heapify(arr, n, largest); // 递归地维护堆
  16. }
  17. }
  18. void heap_sort(int arr[], int n) {
  19. // 建立初始堆,从最后一个非叶子节点开始
  20. for (int i = n / 2 - 1; i >= 0; --i) {
  21. heapify(arr, n, i);
  22. }
  23. // 依次取出堆顶元素并维护堆
  24. for (int i = n - 1; i > 0; --i) {
  25. std::swap(arr[0], arr[i]); // 将堆顶元素交换到数组末尾
  26. heapify(arr, i, 0); // 维护堆
  27. }
  28. }

计数排序(Counting Sort)

  1. void counting_sort(int arr[], int n) {
  2. int max_val = *std::max_element(arr, arr + n); // 找到最大值
  3. int count[max_val + 1] = {}; // 初始化计数数组
  4. for (int i = 0; i < n; ++i) { // 统计每个元素的出现次数
  5. ++count[arr[i]];
  6. }
  7. for (int i = 1; i <= max_val; ++i) { // 对计数数组进行前缀和处理
  8. count[i] += count[i - 1];
  9. }
  10. int output[n]; // 临时数组
  11. for (int i = n - 1; i >= 0; --i) { // 从后往前遍历原始数组
  12. output[count[arr[i]] - 1] = arr[i]; // 将元素放到正确的位置上
  13. --count[arr[i]]; // 减少计数
  14. }
  15. std::copy(output, output + n, arr); // 将临时数组复制回原始数组
  16. }

桶排序(Bucket Sort)

  1. void bucket_sort(float arr[], int n) {
  2. std::vector<float> buckets[n]; // 创建 n 个空桶
  3. for (int i = 0; i < n; ++i) { // 将元素放入对应的桶中
  4. int idx = n * arr[i];
  5. buckets[idx].push_back(arr[i]);
  6. }
  7. for (int i = 0; i < n; ++i) { // 对每个桶内部进行排序
  8. std::sort(buckets[i]..begin(), buckets[i].end());
  9. }
  10. int idx = 0;
  11. for (int i = 0; i < n; ++i) { // 将所有桶中的元素依次合并
  12. for (float num : buckets[i]) {
  13. arr[idx++] = num;
  14. }
  15. }
  16. }

基数排序

  1. void radix_sort(int arr[], int n) {
  2. int max_val = *std::max_element(arr, arr + n); // 找到最大值
  3. int exp = 1; // 当前位数
  4. std::vector<int> output(n); // 临时数组
  5. while (max_val / exp > 0) { // 从低位到高位依次处理每一位
  6. std::vector<int> count(10); // 初始化计数数组
  7. for (int i = 0; i < n; ++i) { // 统计当前位数的出现次数
  8. ++count[(arr[i] / exp) % 10];
  9. }
  10. for (int i = 1; i < 10; ++i) { // 对计数数组进行前缀和处理
  11. count[i] += count[i - 1];
  12. }
  13. for (int i = n - 1; i >= 0; --i) { // 从后往前遍历原始数组
  14. output[count[(arr[i] / exp) % 10] - 1] = arr[i]; // 将元素放到正确的位置上
  15. --count[(arr[i] / exp) % 10]; // 减少计数
  16. }
  17. std::copy(output.begin(), output.begin() + n, arr); // 将临时数组复制回原始数组
  18. exp *= 10; // 处理下一位
  19. }
  20. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/278152
推荐阅读
相关标签
  

闽ICP备14008679号