您的位置:首页 > 其它

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

2015-06-15 10:25 896 查看
原理和快速排序类似,只是不需要确定每个元素的顺序,只需要确定每个区域的位置。

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: