双指针排序一般用于两端无序,中间有序的情况,若完全无序,则不能使用
有序数组分为三种:
1.所有数字全为正数,0;2.所有数字全为负数,0;3.数字包含负数,0,正数
前两种情况平方后数字的排序位置不会改变,第三种情况,平方之后的最大最小值会发生变化,也就是数组的两端可能会变得无序。
public int[] sortedSquares(int[] nums) {//返回值为数组
//先平方
int nums1[]=new int [nums.length];
for(int i=0;i<nums1.length;i++){
nums1[i]=nums[i]*nums[i];
}
System.out.println(Arrays.toString(nums1));//输出排序之前的状态
//双指针 只需对比数组两端找出最大值,排序后一些数字的相对位置是不变的
int nums2[]=new int [nums1.length];//定义一个新数组,将nums1的数字比较后写入到nums2中
int left=0;
int right=nums1.length-1;//left,right,分别指向nums1的头和尾
int write=nums2.length-1;//write指向nums2中要写入的地方,从尾部开始写入
while(left<=right){//循环开始
if(nums1[left]>nums1[right]){
nums2[write]=nums1[left];//比较后将较大的数字写入write
left++;//被写入的指针移动,另一个在原地不动
write--;//write指针移动,指向下一个该写入的位置
}else{
nums2[write]=nums1[right];
right--;
write--;
}
}
return nums2;//返回排序好的数组
}