标签:for 做了 new 个数 一个 nlogn 插入排序 mamicode 排序
public int[] insertionSort(int[] array) {
if (array.length == 0) {
return array;
}
int current;
for (int i = 0; i < array.length - 1; i++) {
current = array[i + 1];//从第二个元素开始,与之前的元素进行比较;之后的每个元素都做相同的操作
int preIndex = i;//从当前元素开始比较
while (preIndex >= 0 && current < array[preIndex]) {//如果当前元素比下一个元素大,就将当前元素移到下一位
array[preIndex + 1] = array[preIndex];
preIndex--;
}
array[preIndex + 1] = current;//前面做了--操作,避免越界-1以及补回多减掉的1,所以preIndex+1;把当前值的下一个赋到此处;如果current比它前面的所有值都大,位置就不变
}
return array;
}
public int[] MergeSort(int[] array) {
if (array.length < 2) return array;
int mid = array.length / 2;//取中间索引
int[] left = Arrays.copyOfRange(array, 0, mid);//将初始数组分为两个数组,第一次分解
int[] right = Arrays.copyOfRange(array, mid, array.length);
return merge(MergeSort(left), MergeSort(right));//递归分解,再合并;会一直分解到单个数为止,到那个时候,left的长度为0
}
public int[] merge(int[] left, int[] right) {
int[] result = new int[left.length + right.length];
for (int index = 0, i = 0, j = 0; index < result.length; index++) {
if (i >= left.length) {//如果左边left数组的值已经遍历完,那么result数组剩下的位置用right数组剩下的值来填
result[index] = right[j++];
} else if (j >= right.length) {//同理,如果right数组已经遍历完,就直接把left数组剩下的值来填result剩下的位置
result[index] = left[i++];
} else if (left[i] > right[j]) {
result[index] = right[j++];//如果前面的两个都没满足,就需要比较当前left数组和right数组的当前值,谁小就把谁填进result
} else {
result[index] = left[i++];
}
}
return result;
}
标签:for 做了 new 个数 一个 nlogn 插入排序 mamicode 排序
原文地址:https://www.cnblogs.com/shoan-kwichou/p/14594808.html