您的位置:首页 > 其它

【从头开始学算法】归并排序

2015-09-27 12:15 344 查看
需求:将数组中元素排序

思路:将数组拆分成若干一个元素的小数组,数组两两合并,

与之前的排序方法不同在于,归并排序,需要额外的空间,用来临时存放合并后的小数组

public static void MergeSort(int[] arr, int first, int last) {
System.out.println("MergeSort"+first+last);
int mid = 0;
if (last - first > 1) {
mid = (last + first) / 2;
MergeSort(arr, first, mid);//排序中认为最右端不可达,所以,mid不能+1;

MergeSort(arr, mid , last);
Merge(arr, first, mid, last);
}

}

private static void Merge(int[] arr, int first, int mid, int last) {
System.out.println("Merge"+first+mid+last);
int[] arr1 = new int[last - first + 1];
int i = first;
int j = mid;
int n = 0;
while (i < mid && j < last) {
if (arr[i] <= arr[j]) {
arr1
= arr[i];
i++;
n++;
} else {
arr1
= arr[j];
j++;
n++;
}
}
while (i < mid) {
arr1
= arr[i];
i++;
n++;
}
while (j < last) {
arr1
= arr[j];
j++;
n++;
}
int a = 0;
for (int x = first; x <last; x++) {
arr[x] = arr1[a++];
}
arr1 = null;
}


这个其实不难理解,就是顺着一支向下拆,拆到最下边向上合并,合并完这一支的元素,继续拆下一支(计算机做的顺序)

过程如图,以数组下标0-7为例,黑色为拆分过程,黄色为合并过程,框中数字为矩阵下标,线上数字为处理顺序



时间复杂度:O(nlogn)

空间复杂度:O(n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: