-
包含头文件:程序首先包含了标准输入输出库
stdio.h
,以便使用printf
等函数进行输入输出操作。 -
定义数组和数组大小:定义了一个宏
N
,其值为5,表示数组q
的长度。数组q
被初始化为{5, 3, 8, 4, 2}
,这是我们要排序的原始数组。同时定义了一个辅助数组w
,用于在归并过程中临时存储数据。 -
归并排序函数:
merge_sort
函数是一个递归函数,它接受两个参数l
和r
,分别表示要排序的子数组的起始和结束索引。如果子数组的长度为1(即l >= r
),则不需要排序,函数直接返回。函数递归地将数组分为两半,分别对左半部分l
到mid
和右半部分mid + 1
到r
进行排序。在归并过程中,使用三个指针
i
、j
和k
,分别指向左半部分的当前元素、右半部分的当前元素和辅助数组w
的当前位置。第一个while
循环比较左右两部分的当前元素,将较小的元素复制到辅助数组w
中。接下来的两个while
循环分别处理左右两部分的剩余元素。最后一个for
循环将辅助数组w
中的元素复制回原数组q
,完成归并过程。 -
主函数:
main
函数是程序的入口点。调用merge_sort
函数,传入0和N - 1
作为参数,表示对整个数组q
进行排序。使用一个for
循环和printf
函数打印排序后的数组。 -
运行结果:程序将输出排序后的数组
{2, 3, 4, 5, 8}
,这表示数组q
已经被成功排序。 -
总结:这个程序展示了归并排序算法的实现,它通过递归地将数组分成更小的部分,然后合并这些部分来排序整个数组。归并排序的时间复杂度为O(n log n),是一种稳定的排序算法。
#include <stdio.h>
#define N 5 // 定义数组q的长度
int q[N] = { 5, 3, 8, 4, 2 }; // 待排序的数组
int w[N]; // 辅助数组
void merge_sort(int l, int r) {
if (l >= r)
return;
int mid = l + r >> 1; // 计算中间位置
merge_sort(l, mid);
merge_sort(mid + 1, r);
int i = l, j = mid + 1, k = 0;
while (i <= mid && j <= r) {
if (q[i] <= q[j])
w[k++] = q[i++];
else
w[k++] = q[j++];
}
while (i <= mid)
w[k++] = q[i++];
while (j <= r)
w[k++] = q[j++];
for (i = l, j = 0; j < k; i++, j++)
q[i] = w[j];
}
int main() {
merge_sort(0, N - 1);
printf("Sorted array: ");
for (int i = 0; i < N; i++) {
printf("%d ", q[i]);
}
printf("\n");
return 0;
}