归并排序,主要思想:把两个有序数组,组合成一个大的有序数组。
如何获取一个有序数组,可以通过分治,把数组所有元素分成一个元素,那就是有序的,然后合并。就这样完成了
如下所示,往下递归分成有序数列,然后往上合并成一个有序数列。
复杂度:nO(logn)
public class QuickSort {
public static void main(String[] args) {
int[] arr = {-9,78,0,23,-567,70};
int[] temp = new int[arr.length];
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr,int left,int right){
if (left >= right){
return;
}
int mid = left + (right - left)/2;
quickSort(arr,left,mid);
quickSort(arr,mid+1,right);
//合并两个有序数组
int length = 0;//表示辅助空间有多少元素
int i_start = left;
int i_end = mid;
int j_start = mid + 1;
int j_end = right;
int[] temp = new int[j_end - i_start + 1];
while (i_start <= i_end && j_start <= j_end){
if (arr[i_start] < arr[j_start]){
temp[length] = arr[i_start];
i_start++;
length++;
}else{
temp[length] = arr[j_start];
j_start++;
length++;
}
}
//把右边多出来的数组全部加入到临时数组后面。由于数组有序,所以最大
while(j_start <= j_end){
temp[length++] = arr[j_start++];
}
//左边
while(i_start <= i_end){
temp[length++] = arr[i_start++];
}
//把最终的结果复制给原数组
for (int i = 0; i < temp.length; i++) {
arr[left + i] = temp[i];
}
}
}