STEP #1

(1/2)

此处切换ai服务商,可对比多家ai的回复,取最优解。

上一步下一步关闭
酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

用c语言写归并排序算法,加注释,让新手能看懂

```c #include <stdio.h> #include <stdlib.h> // 定义一个函数用于合并两个有序数组 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("原始数组: \n"); for (int i = 0; i < n; i++) printf("%d ", arr[i]); printf("\n"); mergeSort(arr, 0, n - 1); // 调用归并排序 printf("排序后的数组: \n"); for (int i = 0; i < n; i++) printf("%d ", arr[i]); printf("\n"); return 0; } ``` ### 额外需要注意的逻辑点: 1. **边界条件**:在 `mergeSort` 函数中,当 `left` 等于 `right` 时,表示只有一个元素,不需要再进行分割。 2. **临时数组的大小**:在 `merge` 函数中,创建临时数组 `L``R` 时,要确保它们的大小与要合并的子数组相匹配。 3. **指针的移动**:在 `merge` 函数中,`i``j``k` 指针的移动要正确,确保所有元素都能被正确合并到原数组中。 [2024-11-23 16:00:45 | AI写代码神器 | 896点数解答]
相关提问