划分一个整形数组,把负数放在左边,零放在中间,正数放在右边

原理和快速排序类似,只是不需要确定每个元素的顺序,只需要确定每个区域的位置。

func main() {
    // 问题描述:划分一个整形数组,把负数放在左边,零放在中间,正数放在右边
    arr := []int{0, 2, 4, 3, 1, 0, -3, -1, -2}
    fmt.Printf("原数组: %v \n", arr)
    low := 0            // 负数区域,指向负数区域后的第一个位置
    mid := 0            // 0区域,指向0区域后的第一个位置,也是当前遍历位置
    hig := len(arr) - 1 // 正数区域,指向区域前的第一个位置

    for mid <= hig { // 当行进到正数区域前停止
        cur := arr[mid]
        if cur < 0 { // 当前元素添加到负数区域并向前进一格
            arr[mid], arr[low] = arr[low], arr[mid] // 有可能和自身交换
            mid++
            low++
        } else if cur == 0 {
            mid++
        } else { // 加入到正数区域,mid不减一,因为arr[hig]并不知道是属于哪个区域
            arr[mid], arr[hig] = arr[hig], arr[mid]
            hig--
        }
    }

    fmt.Printf("结果: %v \n", arr)
}

执行结果:

原数组: [0 2 4 3 1 0 -3 -1 -2] 
结果: [-2 -1 -3 0 0 1 3 4 2] 
实现将一个数组中的负数放在数组的前面,可以使用C语言的双指针法来完成。 首先,定义两个指针,一个指向数组的头部(命名为head),一个指向数组的尾部(命名为tail)。 然后,使用while循环,不断地移动指针head,直到找到第一个负数元素为止。 接下来,使用while循环,不断地移动指针tail,直到找到第一个正数元素为止。 在每一次循环开始之前,需要判断head和tail指针是否相遇。如果相遇,则说明数组负数已经全部放在了前面,退出循环。 如果head指针指向的元素大于0,而tail指针指向的元素小于0,说明head和tail指针所指向的数需要交换。交换之后,head指针向右移动一个位置,tail指针向左移动一个位置。 重复以上步骤,直到head和tail指针相遇。 最后,数组中的负数都被放在数组的前面。 以下是具体实现的C代码: ```c #include <stdio.h> void rearrangeNegative(int arr[], int size) { int head = 0; // 头指针 int tail = size - 1; // 尾指针 while (head < tail) { while (arr[head] < 0) { head++; } while (arr[tail] >= 0) { tail--; } if (head < tail) { // 交换head和tail指针所指向的数据 int temp = arr[head]; arr[head] = arr[tail]; arr[tail] = temp; } } } int main() { int arr[] = {1, -2, 3, -4, 5, -6}; int size = sizeof(arr) / sizeof(arr[0]); rearrangeNegative(arr, size); printf("重新排列后的数组:"); for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } return 0; } ``` 运行结果: 重新排列后的数组:-2 -4 -6 1 5 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值