使用C++实现冒泡排序

使用C++实现冒泡排序



基础版本的冒泡排序

int lastNotSwapped = arrSize-1;
for (int pass = 1; pass <= arrSize-1; pass++)
{
    for (int j = 0; j < lastNotSwapped; j++)
    {
        if (arr[j] > arr[j + 1])
        {
            swap(arr[j], arr[j + 1]);
        }
    }
    lastNotSwapped -= 1;
}

 int lastNotSwapped = arrSize-1;

此句定义了最后一个未排序的元素为数组最后一个元素。

for (int pass = 1; pass <= arrSize-1; pass++)

外层循环,共进行arrSize-1轮排序

for (int j = 0; j < lastNotSwapped; j++)
    {
        if (arr[j] > arr[j + 1])
        {
            swap(arr[j], arr[j + 1]);
        }
    }
lastNotSwapped -= 1;

内层循环,经过一轮排序,最后一个数变为已排序,其前一个数变为未排序


加强版本的冒泡排序

    int lastNotSwapped = arrSize-1;
    int tempLastNotSwapped = arrSize - 1;
    bool swapped = false;

    do
    {
        swapped = false;
        int temp(0);
        lastNotSwapped = tempLastNotSwapped;
        for (int j = 0; j < lastNotSwapped; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                swap(arr[j], arr[j + 1]);
                swapped = true;
                tempLastNotSwapped=j;
            }
        }
    } while (swapped);

    int lastNotSwapped = arrSize-1;
    int tempLastNotSwapped = arrSize - 1;
    bool swapped = false;

默认未排序。

    do
    {
        swapped = false;
        int temp(0);
        lastNotSwapped = tempLastNotSwapped;
        for (int j = 0; j < lastNotSwapped; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                swap(arr[j], arr[j + 1]);
                swapped = true;
                tempLastNotSwapped=j;
            }
        }
    } while (swapped);
  • 内层循环不必解释,还仍是不断比较前后大小直到最后一个未排序元素
  • 值得一说的是temp的作用——在内循环时若进行交换,则将temp暂时定义为进行交换时的i,若之后还有交换则继续更改。一轮排序结束后temp的值就是最后一个未排序元素,此时再将其赋给lastNotSwapped。
  • 若一轮排序未发生交换,则跳出外层循环,此时Swapped为假


可视化的排序过程,详见https://visualgo.net/en/sorting

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值