用c语言写一个归并算法
时间: 2023-03-12 20:48:37 浏览: 68
首先,你需要创建一个函数,该函数将接收一个数组作为输入参数,并返回一个已经排序的数组。要实现归并排序,你需要实现以下步骤:1. 如果输入数组的长度小于2,则直接返回该数组,因为它已经是排序的了。2. 否则,你需要将输入数组分割成两个子数组,然后分别对这两个子数组进行排序,然后将结果归并起来。3. 最后,返回归并后的结果数组。
相关问题
用c语言写一个归并并排序算法
以下是C语言实现的归并排序算法:
```c
#include <stdio.h>
// 合并两个有序数组,left到mid为一个数组,mid到right为另一个数组
void merge(int arr[], 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 = 0; i < n1; i++)
L[i] = arr[left + i];
for (j = 0; j < n2; j++)
R[j] = arr[mid + 1 + j];
i = 0; // 左数组的起点
j = 0; // 右数组的起点
k = left; // 合并后数组的起点
// 比较左右数组元素大小,将较小的元素放入合并后的数组中
while (i < n1 && j < n2) {
if (L[i] <= R[j]) {
arr[k] = L[i];
i++;
}
else {
arr[k] = R[j];
j++;
}
k++;
}
// 将剩余的元素放入合并后数组中
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
// 归并排序
void mergeSort(int arr[], int left, int right) {
if (left < right) {
int mid = left + (right - left) / 2; // 计算中间位置
mergeSort(arr, left, mid); // 递归排序左半边数组
mergeSort(arr, mid + 1, right); // 递归排序右半边数组
merge(arr, left, mid, right); // 合并两个有序数组
}
}
int main() {
int arr[] = { 12, 11, 13, 5, 6, 7 };
int n = sizeof(arr) / sizeof(arr[0]);
printf("Original array: ");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
mergeSort(arr, 0, n - 1);
printf("\nSorted array: ");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
```
输出结果为:
```
Original array: 12 11 13 5 6 7
Sorted array: 5 6 7 11 12 13
```
用C语言写一个三路归并算法
好的,以下是使用C语言实现三路归并算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
void merge(int arr[], int left[], int leftSize, int middle[], int middleSize, int right[], int rightSize) {
int i = 0, j = 0, k = 0;
while (i < leftSize && j < middleSize && k < rightSize) {
if (left[i] < middle[j]) {
if (left[i] < right[k]) {
arr[i + j + k] = left[i];
i++;
} else {
arr[i + j + k] = right[k];
k++;
}
} else {
if (middle[j] < right[k]) {
arr[i + j + k] = middle[j];
j++;
} else {
arr[i + j + k] = right[k];
k++;
}
}
}
while (i < leftSize && j < middleSize) {
if (left[i] < middle[j]) {
arr[i + j + k] = left[i];
i++;
} else {
arr[i + j + k] = middle[j];
j++;
}
}
while (i < leftSize && k < rightSize) {
if (left[i] < right[k]) {
arr[i + j + k] = left[i];
i++;
} else {
arr[i + j + k] = right[k];
k++;
}
}
while (j < middleSize && k < rightSize) {
if (middle[j] < right[k]) {
arr[i + j + k] = middle[j];
j++;
} else {
arr[i + j + k] = right[k];
k++;
}
}
while (i < leftSize) {
arr[i + j + k] = left[i];
i++;
}
while (j < middleSize) {
arr[i + j + k] = middle[j];
j++;
}
while (k < rightSize) {
arr[i + j + k] = right[k];
k++;
}
}
void merge_sort(int arr[], int size) {
if (size > 1) {
int leftSize = size / 3;
int middleSize = size / 3;
int rightSize = size - leftSize - middleSize;
int left[leftSize], middle[middleSize], right[rightSize];
for (int i = 0; i < leftSize; i++) {
left[i] = arr[i];
}
for (int i = 0; i < middleSize; i++) {
middle[i] = arr[leftSize + i];
}
for (int i = 0; i < rightSize; i++) {
right[i] = arr[leftSize + middleSize + i];
}
merge_sort(left, leftSize);
merge_sort(middle, middleSize);
merge_sort(right, rightSize);
merge(arr, left, leftSize, middle, middleSize, right, rightSize);
}
}
int main() {
int arr[] = {9, 1, 6, 3, 8, 7, 5, 2, 0, 4};
int size = sizeof(arr) / sizeof(arr[0]);
merge_sort(arr, size);
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)