给定一个包含n个元素的一维线性序列a[left:right],对这n个元素按照非递减顺序排序。设a[0:7]={23,5,9,16,30,25,17,18},采用基于分治策略的合并排序算法解决该问题。 1) 简述合并排序算法基本思想以及步骤。 2) 写出算法实现代码。 3) 写出该算法所需计算时间的递归方程,并写出求解结果。
时间: 2023-04-02 18:00:43 浏览: 171
合并排序递归算法
1) 合并排序算法的基本思想是将待排序序列分成两个子序列,分别对子序列进行排序,然后将两个有序子序列合并成一个有序序列。具体步骤如下:
- 将待排序序列分成两个子序列,分别为左子序列和右子序列。
- 对左子序列和右子序列分别进行排序,可以采用递归的方式进行排序。
- 将排好序的左子序列和右子序列合并成一个有序序列。
2) 算法实现代码如下:
void merge(int a[], int left, int mid, int right) {
int i, j, k;
int n1 = mid - left + 1;
int n2 = right - mid;
int L[n1], R[n2];
for (i = ; i < n1; i++)
L[i] = a[left + i];
for (j = ; j < n2; j++)
R[j] = a[mid + 1 + j];
i = ;
j = ;
k = left;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
a[k] = L[i];
i++;
} else {
a[k] = R[j];
j++;
}
k++;
}
while (i < n1) {
a[k] = L[i];
i++;
k++;
}
while (j < n2) {
a[k] = R[j];
j++;
k++;
}
}
void mergeSort(int a[], int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergeSort(a, left, mid);
mergeSort(a, mid + 1, right);
merge(a, left, mid, right);
}
}
int main() {
int a[] = {23, 5, 9, 16, 30, 25, 17, 18};
int n = sizeof(a) / sizeof(a[]);
mergeSort(a, , n - 1);
for (int i = ; i < n; i++)
printf("%d ", a[i]);
return ;
}
3) 该算法的递归方程为 T(n) = 2T(n/2) + O(n),其中 T(n) 表示排序 n 个元素所需的时间。根据主定理,可以得到 T(n) = O(nlogn)。
阅读全文