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

来源:互联网 发布:手机直播录制软件 编辑:程序博客网 时间:2024/05/15 20:04

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

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] 
0 0