16、三部排序

该代码示例展示了如何使用Java实现一种特殊的排序方法,将一个整数数组中的负数移动到左侧,正数移动到右侧,而0则保留在中间。算法通过两个指针left和right以及一个遍历指针p进行操作,无需额外空间,具有原地排序的特点。
摘要由CSDN通过智能技术生成

三部排序
将负数放到左边 正数放到右边 有0的话,则放中间

public class Test4 {
    public static void main(String[] args) {
        // 三部排序
        // 将负数放到左边 正数放到右边 有0的话,则放中间
        Integer[] data = { 1, 2, 3 - 4, -6, 3, 0 };
        sort1(data);
        for (int i = 0; i < data.length; i++)
            System.out.print(data[i] + "\t");
    }
    private static void sort1(Integer[] data) {
        int left = 0;
        int right = data.length - 1;
        int p = 0;
        while (p <= right) { // 当指针p小于等于right的时候,循环判断
            if (data[p] < 0) {// 当前元素需要放左边,和下标left的元素交换
                data[left] = data[left] ^ data[p];
                data[p] = data[left] ^ data[p];
                data[left] = data[left] ^ data[p];
                p++;
                left++; // 因为左边的位置 被占据,故而往后移动一个位置
            } else if (data[p] > 0) {// 当前元素需要放右边,和下标right的元素交换
                data[right] = data[right] ^ data[p];
                data[p] = data[right] ^ data[p];
                data[right] = data[right] ^ data[p];
                right--; // 因为做了个交换,而不知道换到p位置的元素的大小,故而p位置需要继续判断
                         // 因此只右移right指针
            } else {// 当等于0的时候,p后移即可
                p++;
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值