用c语言实现分治算法(合并排序、快速排序):
时间: 2024-06-15 14:01:48 浏览: 134
在C语言中,分治算法是一种常见的算法设计思想,它将一个问题分解为规模较小的子问题来求解,通常包括两个步骤:分解(divide)和合并(combine)。这里我们将分别介绍如何使用C语言实现合并排序和快速排序这两种经典的分治算法。
### 合并排序(Merge Sort)
**合并排序**的基本思想是将待排序的数组分成两半,对每一半递归地进行排序,然后合并两个已排序的部分。以下是C语言的实现:
```c
#include <stdio.h>
// 合并两个已排序的数组
void merge(int arr[], int l, int m, int r) {
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
// 创建临时数组
int L[n1], R[n2];
// 将数据复制到临时数组
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1+ j];
// 合并临时数组
i = 0;
j = 0;
k = l;
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
} else {
arr[k] = R[j];
j++;
}
k++;
}
// 如果L数组还有剩余元素
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
// 如果R数组还有剩余元素
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
// 分治法:合并排序
void mergeSort(int arr[], int l, int r) {
if (l < r) {
int m = l+(r-l)/2;
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, m, r);
}
}
int main() {
int arr[] = {12, 11, 13, 5, 6, 7};
int arr_size = sizeof(arr) / sizeof(arr);
mergeSort(arr, 0, arr_size - 1);
printf("Sorted array: \n");
for (int i = 0; i < arr_size; i++)
printf("%d ", arr[i]);
return 0;
}
```
**相关问题**:
1. 除了插入排序,还有哪些常用的分治算法?
2. 分治策略在其他数据结构或算法中有哪些应用?
3. 为什么要对数组进行分区操作?
### 快速排序(Quick Sort)
**快速排序**是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分记录继续进行排序,直到整个序列有序。以下是C语言的实现:
```c
#include <stdio.h>
// 交换两个元素
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
// 选择枢轴,这里选择第一个元素作为枢轴
int partition(int arr[], int low, int high) {
int pivot = arr[low];
int i = (low + 1), j = high;
while (i <= j) {
while (i <= j && arr[i] < pivot)
i++;
while (i <= j && arr[j] > pivot)
j--;
if (i < j)
swap(&arr[i], &arr[j]);
}
swap(&arr[low], &arr[j]);
return j;
}
// 快速排序
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int arr_size = sizeof(arr) / sizeof(arr);
quickSort(arr, 0, arr_size - 1);
printf("Sorted array: \n");
for (int i = 0; i < arr_size; i++)
printf("%d ", arr[i]);
return 0;
}
```
**相关问题**:
1. 快速排序的平均时间复杂度是多少?
2. 快速排序与归并排序相比,哪种更适合处理大规模数据?
3. 快速排序在什么情况下可能会退化成O(n^2)的时间复杂度?
阅读全文