您的位置:首页 > 理论基础 > 数据结构算法

【数据结构与算法】二路归并排序

2014-08-11 17:00 344 查看
空间复杂度
由于辅助空间刚好要占用那个单元,但每一趟归并后这些空间就被释放了,所以归并排序的空间复杂度是O(n)。

时间复杂度
每趟归并的时间复杂度是O(n),共需要进行log2n趟归并,所以时间复杂度是O(n*log2n)。

代码实现
/**
* 源码名称:MergeSort.java
* 日期:2014-08-11
* 程序功能:合并排序
* 版权:CopyRight@A2BGeek
* 作者:A2BGeek
*/
public class MergeSort {

public void mergeSort(int[] in, int[] tmp, int start, int end) {
if (start == end) {
return;
} else {
int mid = (start + end) / 2;
mergeSort(in, tmp, start, mid);
mergeSort(in, tmp, mid + 1, end);
merge2Sub(in, tmp, start, mid, end);
}
}

/**
* 函 数 名:merge2Sub 功能描述:合并相邻的有序表 输入参数:
*
* @param a
* 待排序数组
* @param tmp
* 临时用于交换数据
* @param start
* 第一个有序表的起点索引
* @param mid
* 第一个有序表的终点索引
* @param end
* 第二个有序表的终点索引
*/
public void merge2Sub(int[] a, int[] tmp, int start, int mid, int end) {
int i = start;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= end) {
if (a[i] <= a[j]) {
tmp[k] = a[i];
i++;
k++;
} else {
tmp[k] = a[j];
j++;
k++;
}
}
while (i <= mid) {
tmp[k] = a[i];
i++;
k++;
}
while (j <= end) {
tmp[k] = a[j];
j++;
k++;
}

for (int index = 0; index < end - start + 1; index++) {
a[start + index] = tmp[index];
}
}

public void printArray(int[] in) {
for (int i : in) {
System.out.print(i + " ");
}
System.out.println();
}

public static void main(String[] args) {
int[] testCase = { 1, 3, 4, 10, 2, 5, 6, 7, 9, 11 };
int length = testCase.length;
int tmp[] = new int[length];
MergeSort mMergeSort = new MergeSort();
mMergeSort.printArray(testCase);
mMergeSort.mergeSort(testCase, tmp, 0, length - 1);
mMergeSort.printArray(testCase);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息