归并排序
思路:(数据规模 n)
1.定义一个方法(包含以下2,3,4步骤)(里面还有排序的一些思想在里面)
2.把数组分均分为左右两部分(总数为奇数谁多一个都可以)
3.左右两部分分别调用,最开始定义的方法给自己排序
4.返回排好序的左右两部分
(用到了递归)
关键代码
//根据自己的理解先写出来的代码
//中间有一些小问题100以内的数都可以排序,如果有更大需要该改一些值,实在想不到其他解决办法
public static int[] f(int[] arr){
int l = arr.length;
if(l==1){
return arr;
}
int middle =l/2;
int[] left = f(Arrays.copyOfRange(arr, 0, middle));
int[] right = f(Arrays.copyOfRange(arr, middle, l));
int i=0,j=0;
int k1=left[i],k2=right[j];
for(int m=0;m<l;m++){
if(k2<k1){
arr[m]=k2;
j++;
if(j>right.length-1) k2=100;
else k2=right[j];
}else{
arr[m]=k1;
i++;
if(i>left.length-1) k1=100;
else k1=left[i];
}
}
return arr;
}
网上的代码
public int[] sort(int[] sourceArray) throws Exception {
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
if (arr.length < 2) {
return arr;
}
int middle = (int) Math.floor(arr.length / 2);
int[] left = Arrays.copyOfRange(arr, 0, middle);
int[] right = Arrays.copyOfRange(arr, middle, arr.length);
return merge(sort(left), sort(right));
}
protected int[] merge(int[] left, int[] right) {
int[] result = new int[left.length + right.length];
int i = 0;
while (left.length > 0 && right.length > 0) {
if (left[0] <= right[0]) {
result[i++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
} else {
result[i++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
}
while (left.length > 0) {
result[i++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
}
while (right.length > 0) {
result[i++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
return result;
}
}