不一样的冒泡排序

排序思路:循环取出最大值放在数组的最后,最小值放到最前。

上代码:

void bubbleSort5(int[] arr)
{
    //设置数组左右边界
    int left = 0, right = arr.Length;
    int min ,max;
    int x1 = 0, x2 = 0;
    int t1 = 0, t2 = 0;
    
    //当左右边界未重合时,继续排序
    while (left < right)
    {
        min = int.MaxValue;
        max = int.MinValue;
        for (int i = left; i < right; i++)
        {
            //选出最大的数放到数组右边
            if (arr[i] > max)
            {
                max = arr[i];
                x1 = i;
            }
            //选出最大的数放到数组左边
            if (arr[i] < min)
            {
                min = arr[i];
                x2 = i;
            }                    
        }

        if (x1 == right - 1 && x2 == left)
        {
            right--;
            left++;
            continue;
        }

        t1 = arr[right-1];//缓存右边界值
        t2 = arr[left];//缓存左边界值

        arr[right - 1] = max;//存放最大值                
        arr[left] = min;//存放最小值

        //同时交换时防止边界值覆盖最大值和最小值
        //最大值不在左边界,且最小值不在右边界
        if (x2 != right - 1 && x1 != left)
        {
            arr[x2] = t2;
            arr[x1] = t1;
        }
        //最大值在左边界,且最小值不在右边界,仅交换右边界的值
        if (x1 == left && x2 != right - 1) arr[x2] = t1;
        //最大值不在左边界,且最小值在右边界,仅交换左边界的值
        if (x1 != left && x2 == right - 1) arr[x1] = t2;

        right--;
        left++;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值