鸡尾酒排序问题

题目解释

鸡尾酒排序问题实际上是冒泡排序的一个改进。冒泡排序是一个单向的递增或者递减的交换排序,而鸡尾酒排序则是双向的,也就是说,如果我们以要求一个数组有n个数字从小到大排序,则:

  • 第一趟是正向排序,选出第n个值(最大值);
  • 第二趟是反向排序,选出第1个值(最小值);
  • 第三趟是正向排序,选出第n-1个值(次大值);
  • 第四趟是反向排序,先出第2个值(次小值)。

然后以此类推,最后得出整个序列,所以实际上就相当于将原来的冒泡排序有一段代码写成了两段。然后为了优化运行时间,所以设置一个标志位,当确定没有元素交换的时候,就自动停止运行输出结果。

代码实现

void Cocktail(vector<int>& nums)
{
    bool flag = false;
    int cishu = 1;//输出需要而已
    do
    {
        flag = false;
        //正着走
        for (int i = 0; i < nums.size() - 1; i++)
        {
            if (nums[i] > nums[i + 1])
            {
                int temp = nums[i];
                nums[i] = nums[i + 1];
                nums[i + 1] = temp;
                flag = true;
            }
        }
        //输出第cishu次排序的结果,正式使用去掉这部分
        cout << "第" << cishu << "次排序结果为:";
        showNums(nums);
        ++cishu;
        //展示结束
            flag = false;、
            //反过来走
            for (int j = nums.size() - 1; j > 0; j--)
            {
                if (nums[j] < nums[j - 1])
                {
                    int tmp = nums[j];
                    nums[j] = nums[j - 1];
                    nums[j - 1] = tmp;
                    flag = true;
                }
            }
            //输出第cishu次排序的结果,正式使用去掉这部分
            cout << "第" << cishu << "次排序结果为:";
            showNums(nums);
            ++cishu;
            //展示结   
    } while (flag);

}

代码测试

当我们输入的数组为9,5,7,4,2,1,8,12,33,21,3时,输出结果为

de285197fc948bae7c46d7e1017173d0.png

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注