给定一个包含n个元素的一维线性序列a[left:right],对这n个元素按照非递减顺序排序。设a[0:7]={23,5,9,16,30,25,17,18},采用基于分治策略的合并排序算法解决该问题。 1) 简述合并排序算法基本思想以及步骤。 2) 写出Java代码。 3) 写出该算法所需计算时间的递归方程,并写出求解结果。
时间: 2023-04-02 09:00:45 浏览: 367
合并排序算法(Java)
3星 · 编辑精心推荐
1) 合并排序算法的基本思想是将待排序序列分成两个子序列,分别对子序列进行排序,然后将两个已经有序的子序列合并成一个有序序列。具体步骤如下:
- 将待排序序列分成两个子序列,分别为左子序列和右子序列。
- 对左子序列和右子序列分别进行排序,可以使用递归调用合并排序算法。
- 将已经有序的左子序列和右子序列合并成一个有序序列。
2) Java代码如下:
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
public static void merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int i = left, j = mid + 1, k = ;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
for (int p = ; p < temp.length; p++) {
arr[left + p] = temp[p];
}
}
3) 该算法所需计算时间的递归方程为 T(n) = 2T(n/2) + O(n),其中 n 表示待排序序列的长度。根据主定理,可以得到 T(n) = O(nlogn)。
阅读全文