Java 归并 排序
思路
归并排序通过不断的将原数组进行拆分(通常拆分成左右两项),一直到剩下一项,然后分别将拆分的子数组进行合并,此时,两个子数组已经是排好序的,所以合并排序只需要进行一趟排序即可完成,所以此类排序需要两个步骤:
1.拆分原数组
2.合并子数组。因此此算法是经典的分治算法。
拆分算法的思路
利用递归,不断得寻找左子数组和右子数组,一直到数组的长度为一
合并算法的思路
每次合并需要子数组A,B,并新创建一个临时数组C,同时需要三个计数器 i,j 和 k,其中 i 和 j 用来判断数组是否用完,如果用完,则将剩余的数组元素按顺序放入临时数组中。全部放完后,将临时数组中的已经排好顺序的元素更新到原数组中。
示例
public int[] sort(int[] a, int low, int high){
int mid = (low + high) / 2;
if(low < high){
sort(a, low, mid);
sort(a, mid+1, high);
merge(a, low, mid, high);
}
return a;
}
public void merge(int[] a, int low, int mid, int high){
int[] temp = new int[high - low + 1];
int i = low;
int j = mid + 1;
int k = 0;
while(i <= mid && j<= high){
if(a[i] < a[j]){
temp[k++] = a[i++];
}else{
temp[k++] = a[j++];
}
}
while(i <= mid){
temp[k++] = a[i++];
}
while(j <= high){
temp[k++] = a[j++];
}
for(int x=0;x<temp.length;x++){
a[x+low] = temp[x];
}
}