鱼C论坛

 找回密码
 立即注册
查看: 2584|回复: 9

[已解决]冒泡的改进

[复制链接]
发表于 2022-8-27 21:31:58 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 aaron0919 于 2022-8-28 08:14 编辑

冒泡排序


原版冒泡

冒泡排序

他有一个问题,就是有些排序只要不止 n-1 次,甚至一次就行了。

例如 1 2 4 3 6 5

你的任务

你需要给他改进。

如果对了,可以获得十鱼币!!!

还能显示在我的作品里!
最佳答案
2022-8-27 21:31:59
其实就是每次遍历加一个判断:未排序部分是否全部已经是顺序,如果是就说明已经完全顺序了
没有楼上那么强,我直接用int类型写了
  1. void bubble_sort(int* arr, int size) {
  2.         for (int i = 0; i < size; i++) {
  3.                 int flag = 1; // 0:需要排序  1:不需要排序
  4.                 for (int j = 0; j < size - i - 1; j++) {
  5.                         if (arr[j] > arr[j + 1]) {
  6.                                 flag = 0;
  7.                                 int temp = arr[j];
  8.                                 arr[j] = arr[j + 1];
  9.                                 arr[j + 1] = temp;
  10.                         }
  11.                 }
  12.                 if (flag) break;
  13.         }
  14. }
复制代码

最佳答案

查看完整内容

其实就是每次遍历加一个判断:未排序部分是否全部已经是顺序,如果是就说明已经完全顺序了 没有楼上那么强,我直接用int类型写了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-27 21:31:59 | 显示全部楼层    本楼为最佳答案   
其实就是每次遍历加一个判断:未排序部分是否全部已经是顺序,如果是就说明已经完全顺序了
没有楼上那么强,我直接用int类型写了
  1. void bubble_sort(int* arr, int size) {
  2.         for (int i = 0; i < size; i++) {
  3.                 int flag = 1; // 0:需要排序  1:不需要排序
  4.                 for (int j = 0; j < size - i - 1; j++) {
  5.                         if (arr[j] > arr[j + 1]) {
  6.                                 flag = 0;
  7.                                 int temp = arr[j];
  8.                                 arr[j] = arr[j + 1];
  9.                                 arr[j + 1] = temp;
  10.                         }
  11.                 }
  12.                 if (flag) break;
  13.         }
  14. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-27 23:36:15 | 显示全部楼层
没看懂 “你的任务”
我是这样写冒泡排序的
我比较喜欢从前往后遍历
两层循环的结束条件都是小于data.size()
外层从0开始,内层从 i + 1 开始
  1. template<typename T>
  2. void sort(vector<T> &data, compare_t<T> comp = less_t<T>()) {
  3.     for(size_t i = 0; i < data.size(); ++i) {
  4.         for(size_t j = i + 1; j < data.size(); ++j) {
  5.             if(!comp(data[i], data[j])) swap(data[i], data[j]);
  6.         }
  7.     }
  8. }
复制代码


另外,趁此机会再学习一下C++的模板,还有std::function

  1. #include <iostream>
  2. #include <vector>
  3. #include <functional>

  4. using std::cout, std::endl;
  5. using std::vector;
  6. using std::ostream;
  7. using std::function;

  8. template<typename T>
  9. void swap(T &a, T &b) {
  10.     T temp = a; a = b; b = temp;
  11. }

  12. template<typename T>
  13. struct less_t {
  14.     bool operator()(const T &a, const T &b) {
  15.         return a < b;
  16.     }
  17. };

  18. template<typename T>
  19. struct greater_t {
  20.     bool operator()(const T &a, const T &b) {
  21.         return a > b;
  22.     }
  23. };

  24. template<typename T>
  25. using compare_t = function<bool (const T &a, const T &b)>;

  26. template<typename T>
  27. void sort(vector<T> &data, compare_t<T> comp = less_t<T>()) {
  28.     for(size_t i = 0; i < data.size(); ++i) {
  29.         for(size_t j = i + 1; j < data.size(); ++j) {
  30.             if(!comp(data[i], data[j])) swap(data[i], data[j]);
  31.         }
  32.     }
  33. }

  34. template<typename T>
  35. ostream &operator<<(ostream &os, const vector<T> &data) {
  36.     for(size_t i = 0; i < data.size(); ++i) {
  37.         os << data[i] << " ";
  38.     }
  39.     return os;
  40. }

  41. int main() {
  42.     {
  43.         vector<size_t> data = {1, 2, 4, 3, 6, 5};
  44.         sort<size_t>(data);
  45.         cout << data << endl;
  46.     }
  47.     {
  48.         vector<size_t> data = {1, 2, 4, 3, 6, 5};
  49.         sort<size_t>(data, less_t<size_t>());
  50.         cout << data << endl;
  51.     }
  52.     {
  53.         vector<size_t> data = {1, 2, 4, 3, 6, 5};
  54.         sort<size_t>(data, [](const size_t &a, const size_t &b) {return a < b;});
  55.         cout << data << endl;
  56.     }
  57.     {
  58.         vector<size_t> data = {1, 2, 4, 3, 6, 5};
  59.         sort<size_t>(data, greater_t<size_t>());
  60.         cout << data << endl;
  61.     }
  62.     return 0;
  63. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-28 00:21:53 | 显示全部楼层
嗯,我看了一下你讲的冒泡排序
我这个排序算法应该不能叫冒泡排序,这个排序算法叫什么名字?选择排序?
我对这些概念不是很了解,^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-28 00:24:50 | 显示全部楼层
我看了一下你讲的选择排序,这个应该是选择排序,^_^
解释一下 “你的任务”
我想想怎么改
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-28 00:55:06 | 显示全部楼层
人造人 发表于 2022-8-28 00:24
我看了一下你讲的选择排序,这个应该是选择排序,^_^
解释一下 “你的任务”
我想想怎么改


是选择排序的思路,但是你的遍历方式似乎并不是选择排序的最优解,因为其中有大量不必要的元素交换,感觉挺浪费时间的。
下面是我的选择排序
  1. void selection_sort2(int *arr, int size) {
  2.         for (int i = 0; i < size; i++) {
  3.                 int min = i;
  4.                 for (int j = i + 1; j < size; j++) {
  5.                         if (arr[j] < arr[min]) {
  6.                                 min = j;
  7.                         }
  8.                 }
  9.                 // 判定是否需要交换
  10.                 if (min == i) {
  11.                         continue;
  12.                 } else {
  13.                         int temp = arr[i];
  14.                         arr[i] = arr[min];
  15.                         arr[min] = temp;
  16.                 }
  17.         }
  18. }
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
aaron0919 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-28 01:12:20 | 显示全部楼层
weekend2000 发表于 2022-8-28 00:55
是选择排序的思路,但是你的遍历方式似乎并不是选择排序的最优解,因为其中有大量不必要的元素交换,感 ...

我就是按照冒泡排序的样子写的,我一直以为这个是冒泡排序,^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-8-28 01:15:54 | 显示全部楼层
weekend2000 发表于 2022-8-28 00:55
是选择排序的思路,但是你的遍历方式似乎并不是选择排序的最优解,因为其中有大量不必要的元素交换,感 ...

嗯,这个我看懂了,感谢,^_^
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-28 08:13:05 | 显示全部楼层
人造人 发表于 2022-8-28 00:21
嗯,我看了一下你讲的冒泡排序
我这个排序算法应该不能叫冒泡排序,这个排序算法叫什么名字?选择排序?
...

选择第二个
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-8-28 08:14:49 | 显示全部楼层
weekend2000 发表于 2022-8-28 00:55
是选择排序的思路,但是你的遍历方式似乎并不是选择排序的最优解,因为其中有大量不必要的元素交换,感 ...

因为其实懒得写啦
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 22:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表