双向排序的冒泡算法

文章介绍了如何对冒泡排序算法进行优化,提出一种双向排序方法。该方法先找出数组中最大的值放在右侧,然后寻找最小值放在左侧,同时通过判断相等值避免不必要的排序,提高效率。提供的代码展示了这种改进后的排序过程。
摘要由CSDN通过智能技术生成

双向排序算法,在冒泡的算法上做改进。简单来说就是找到一个大的值,在去找一个小的值。先排右边第一个数据,再排左边第一个,以此类推。(在做一个判断小优化以下,比如右边的第一个已经排完了,和他前一个值相等,前一个值也不需要再排了,标志位移动一下就可以了)。

再用图来简单描述一下。

1.这是一组无序数组

先要排列最大的一个数据,排列完之后。如图 

 

 此时右侧的位置更新到数据4的角标上。让数组左右的位置移动,可能需要一个标志位,数组的遍历可能也需要一个变量。

最后是代码的展示,问题不难,自己画一画,想一想。很容易写出来。最后是代码展示。

void double_buble_sort(int a[],int n)
{
    int left = 0, right = n - 1, flag = 0;
    //大的循环条件,左侧等于右侧,排序完成
    while (left != right)
    {    //从最左侧开始找最大的值放到右侧
        for (int i = flag; i < right; ++i)
        {   
            if (a[i] > a[i + 1])
            exchange_elements(a, i, i + 1);
            flag = i;
             //最大数找到之后,判断之前的数和这最大的数是否相等
            if (i ==right - 1)
            {   //如果相等,说明后面的值和前面的相等,就可以不用排了
                //标志位是没排位置,在前移,做个循环判断
                for (int temp = i; a[temp] == a[temp + 1]; --temp)
                flag = temp - 1;
            }
        }
        //排完一个位置,右侧值需要做一个变更
        right = flag;
        //从最右侧开始最小的值放在最左侧
        for (int i = flag; i > left; --i)
        {
            if (a[i] < a[i - 1])
            exchange_elements(a, i, i - 1);
            flag = i;
            if (i == left + 1)
            {   //比较未排的位置和当前已排这个值是否相等,相等这个就不用排了
                for (int temp = i; a[temp] == a[temp - 1]; ++temp)
                    flag = temp + 1;
            }
                
        }
        //排完左侧的一个数据,左侧位置需要变更
        left = flag;
        }

}

后边是主函数和输出结果,交换函数自己定义一下

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值