写一个 分治算法
时间: 2023-10-11 15:10:36 浏览: 30
好的,下面是一个简单的分治算法示例——归并排序:
归并排序的基本思想是将待排序的序列分成若干个子序列,每个子序列都是有序的,然后再将各个有序的子序列合并成一个有序的序列。
具体的步骤如下:
1. 将原序列平均分成两部分。
2. 对于每个子序列,分别递归地进行归并排序。
3. 将两个有序的子序列合并成一个有序的序列。
下面是示例代码实现:
```
void merge_sort(int arr[], int left, int right) {
if (left >= right) {
return;
}
int mid = (left + right) / 2;
merge_sort(arr, left, mid);
merge_sort(arr, mid + 1, right);
int i = left, j = mid + 1, k = 0;
int tmp[right - left + 1];
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
tmp[k++] = arr[i++];
} else {
tmp[k++] = arr[j++];
}
}
while (i <= mid) {
tmp[k++] = arr[i++];
}
while (j <= right) {
tmp[k++] = arr[j++];
}
for (int p = 0; p < k; p++) {
arr[left + p] = tmp[p];
}
}
```
在这个示例中,我们通过递归地将序列分成子序列,并对每个子序列进行归并排序,最终将两个有序的子序列合并成一个有序的序列。由于每次递归都会将原序列分成两部分,时间复杂度为 O(n log n)。