您的位置:首页 > 其它

算法练习-归并排序

2016-05-05 19:31 162 查看

归并排序

定义

将两个有序对数组归并成一个更大的有序数组。通常做法为递归排序,并将两个不同的有序数组归并到第三个数组中。



复杂度

每一层排序进行N次比较,总共有logN层,时间复杂度: O(NlogN)

因为使用了数组同等大小的辅助空间,空间复杂度:O(N)

代码

public class SortMethod {
public static void merge(int[] arr) {
merge(arr, 0, arr.length - 1);
}

private static void merge(int[] arr, int start, int end) {
if (end <= start) {
return;
}
int mid = (end - start) / 2 + start;
merge(arr, start, mid);
merge(arr, mid + 1, end);
mergeSort(arr, start, mid, end);
}

private static void mergeSort(int[] arr, int start, int mid, int end) {
int[] helper = new int[arr.length];
for (int k = start; k < end; k++) {
helper[k] = arr[k];
}
int i = start, j = mid;
for (int k = start; k <= end; k++) {
if (i > mid) {
arr[k] = helper[j];
j++;
} else if (j > end) {
arr[k] = helper[i];
i++;
} else if (helper[i] < helper[j]) {
arr[k] = helper[i];
i++;
} else {
arr[k] = helper[j];
j++;
}
}
}
}


测试代码:

public class TestSort extends TestCase {

public void testMerge() {
int[] arr = { 5, 3, 2, 1, 10, 5, 23 };
int[] correct = { 1, 2, 3, 5, 5, 10, 23 };
SortMethod.merge(arr);
for (int i = 0; i < arr.length; i++) {
assertEquals(arr[i], correct[i]);
}
}

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