题目描述:
给定一个包含正负数和0的数组,将负数分到数组的左边,正数分到右边,0在中间。
实现:
1.首先想到的是空间换时间的方法;
2.若不允许开辟新的数组,则用双指针从数组两端寻找并交换。
思路同https://blog.csdn.net/orangefly0214/article/details/83271061
private void clf(int[] nums){
int n=nums.length;
int p1=0;
int p2=n-1;
while(p1<p2){
while(p1<p2&&nums[p1]<=0){
p1++;
}
//此时p1指向了大于0的数
while(p1<p2&&nums[p2]>0){
p2--;
}
if(p1<p2){
//此时p2指向了小于0的数
int tmp=nums[p1];
nums[p1]=nums[p2];
nums[p2]=tmp;
}
}
p1=0;
int k=p2-1;
while(p1<k){
while(nums[p1]<0){
p1++;
}
while(nums[k]==0){
k--;
}
if(p1<k){
int tmp2=nums[p1];
nums[p1]=nums[k];
nums[k]=tmp2;
}
}
System.out.println(Arrays.toString(nums));
}