用C语言设计出归并排序的递归和非递归排序算法;对数组中的数据进行排序(按从小到大的顺序排序); 3.根据算法要求编写测试数据文本,该测试数据文本尽可能覆盖问题不同方面;具体要求为: 1)实验数据分两种
时间: 2024-09-29 14:02:16 浏览: 28
[排序算法] 9. 归并排序递归与非递归实现及算法复杂度分析(分治算法、归并排序、复杂度分析)
在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++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
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[] = {9, 7, 5, 11, 12, 2, 14, 3, 10};
int n = sizeof(arr)/sizeof(arr[0]);
mergeSort(arr, 0, n-1);
for(int i=0; i<n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
**非递归版归并排序**:
```c
#include <stdio.h>
#include <stdlib.h>
// Merge function
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++;
}
while (i < n1) {
arr[k] = L[i];
i++;
k++;
}
while (j < n2) {
arr[k] = R[j];
j++;
k++;
}
}
// Non-recursive implementation of merge sort
void mergeSort(int arr[], int size) {
if (size > 1) {
int mid = size / 2;
int left[mid], right[size - mid];
// Divide array into two halves
for (int i = 0; i < mid; i++)
left[i] = arr[i];
for (int i = mid; i < size; i++)
right[i - mid] = arr[i];
// Sort both halves
mergeSort(left, mid);
mergeSort(right, size - mid);
// Merge the sorted halves
int i = 0, j = 0, k = 0;
while (i < mid && j < size - mid) {
if (left[i] <= right[j]) {
arr[k++] = left[i++];
} else {
arr[k++] = right[j++];
}
}
// Copy remaining elements of left half
while (i < mid)
arr[k++] = left[i++];
// Copy remaining elements of right half
while (j < size - mid)
arr[k++] = right[j++];
}
}
int main() {
int arr[] = {9, 7, 5, 11, 12, 2, 14, 3, 10};
int n = sizeof(arr)/sizeof(arr[0]);
mergeSort(arr, n);
for(int i=0; i<n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
```
对于测试数据文本,你可以考虑以下几种情况:
1. **边界条件测试**:空数组、只有一个元素的数组、接近有序的数组、完全无序的数组。
2. **随机数据**:生成不同长度和范围的数据,包括正整数、负整数和零。
3. **大规模数据**:处理大量元素的数组,检查性能是否稳定。
4. **异常输入**:例如,尝试排序包含浮点数的数组,或者数组越界等。
阅读全文