题解 | #排序#
排序
https://www.nowcoder.com/practice/2baf799ea0594abd974d37139de27896
import java.util.*;
//归并排序
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型一维数组 待排序的数组
* @return int整型一维数组
*/
public int[] MySort (int[] nums) {
int length = nums.length;
//length 为 1出口
if(length == 1)
return nums;
int i = 0;
int[] numsleft = new int[length/2];
int j = 0;
while(i<length/2)
{
numsleft[j++] = nums[i++];
}
int k=0;
int[] numsright = new int[length-length/2];
while(i<length){
numsright[k++] = nums[i++];
}
numsleft = MySort(numsleft);
numsright = MySort(numsright);
int[] numsnew =
merge(numsleft,numsright);//这里合并传入的是数组,不是下标
return numsnew;
// write code here
}
public int[] merge(int[] numsleft,int[] numsright){
int left = numsleft.length;
int right = numsright.length;
int[] numsnew = new int[left+right];
int i=0;
int j=0;
int k=0;
while(i<left&&j<right)//while语句长度比for语句短,while中的i,j可以进行切换、跳跃递增,for中的不可以
{ if(numsleft[i]<numsright[j])//不管是左边还是右边,小的放到新数组
{ numsnew[k++] = numsleft[i++];
}else{
numsnew[k++] = numsright[j++];
}
}
//把还未比较的一边的数一个个放到新的合并数组
while(i==left&&j<right){
numsnew[k++] = numsright[j++];
}
while(i<left&&j==right){
numsnew[k++] = numsleft[i++];
}
return numsnew;
}
public int[] merge2(int[] numsleft,int[] numsright){
int left = numsleft.length;
int right = numsright.length;
int[] numsnew = new int[left+right];
int i=0;
int j=0;
int k=0;
while(i<left&&j<right){//
if(numsleft[i] <= numsright[j] ){
numsnew[k++] = numsleft[i++];
} else {
numsnew[k++] = numsright[j++];//不要写成right,会报指针异常错误
}
}
// if(j == right) {
// break;
// }
// //内循环left先出来,循环不到头,内循环不判断left,会报指针异常错误,所以这里外循环无意义,还麻烦,虽然可能可以减少后续一个循环,但不好操作
// }
while(i<left&&j==right)
{
numsnew[k++] = numsleft[i++];
}
while(i==left && j< right)
{
numsnew[k++] = numsright[j++];
}
return numsnew;
}
}
