C++实现冒泡排序、快速排序和归并排序

1.冒泡排序
#include <ioatream>
#include <vector>
#include <algorithm>
void bubbleSort(std::vector<int> &vec)
{
 for (size_t i = 0;i+1 < vec.size();++i) {
  for (size_t j = 0;j + i + 1 < vec.size();++j) {
   if(vec[j]> vec[j + 1])
    std::swap(vec[j], vec[j + 1]);
  }
 }
}
2.快速排序
void quickSort(std::vector<int> &vec, int left, int right)
{
 if (left >= right)
  return;
 int value = vec[left];
 int l = left, r = right, mid = left;
 while (l < r) {
  if (mid == l) {
   if (vec[r] < value) {
    vec[mid] = vec[r];
    ++l;
    mid = r;
   }
   else
    --r;
  }
  else {
   if (vec[l] > value) {
    vec[mid] = vec[l];
    --r;
    mid = l;
   }
   else
    ++l;
  }
 }
 vec[mid] = value;
 quickSort(vec, left, mid - 1);
 quickSort(vec, mid + 1, right);
}
3.归并排序
void guibingmerge(std::vector<int>& ans, int left, int mid, int right)
{
 int cntLeft = left;
 int cntRight = mid+1;
 int cntMerge = left;
 std::vector<int> vec(ans);
 while (cntLeft<mid + 1 && cntRight<=right) {
  ans[cntMerge++] = (vec[cntLeft] < vec[cntRight]) ? vec[cntLeft++] : vec[cntRight++];
 }
 while (cntLeft < mid + 1 && cntRight == right+1)
  ans[cntMerge++] = vec[cntLeft++];
 while (cntRight <= right&&cntLeft == mid + 1)
  ans[cntMerge++] = vec[cntRight++];
}

void guibingsort(std::vector<int> &vec, int left, int right)
{
 if (left >= right)
  return;
 int mid = (left + right) / 2;
 guibingsort(vec, left, mid);
 guibingsort(vec, mid + 1, right);
 guibingmerge(vec, left, mid, right);
}
4.测试用例
int main()
{
 std::vector<int> vec{ 9, 7, 5, 3, 1, 2, 4, 6, 8, 10, 2, 5, 7, 1 };
 for (auto v : vec)
  std::cout << v << " ";
 std :: cout << std::endl;
 //bubbleSort(vec);
 //quickSort(vec, 0, vec.size() - 1);
 guibingsort(vec, 0, vec.size() - 1);
 for (auto v : vec)
  std::cout << v << " ";
 std::cout << std::endl;
 
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值