归并排序
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
- 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
- 自下而上的迭代;
1. 算法步骤
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置;
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
- 重复步骤 3 直到某一指针达到序列尾;
- 将另一序列剩下的所有元素直接复制到合并序列尾。
2.代码
#include <stdio.h>
#include <stdlib.h>
void
merge(int arr[], int temp[], int start, int middle, int end)
{
int i = start, j = middle + 1, k = start;
while (i <= middle && j <= end) {
if (arr[i] > arr[j]) {
temp[k++] = arr[j++];
} else {
temp[k++] = arr[i++];
}
}
while (i <= middle) {
temp[k++] = arr[i++];
}
while (j <= end) {
temp[k++] = arr[j++];
}
for (i = start; i <= end; i++) {
arr[i] = temp[i];
}
}
int
merge_sort(int arr[], int temp[], int start, int end)
{
int middle;
if (start < end) {
middle = start + (end - start) / 2;
merge_sort(arr, temp, start, middle);
merge_sort(arr, temp, middle + 1, end);
merge(arr, temp, start, middle, end);
}
}
int
main()
{
int arr[] = {22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70};
int len = (int) sizeof(arr) / sizeof(*arr);
int *temp_arr = (int *)malloc(len * sizeof(int));
merge_sort(arr, temp_arr, 0, len - 1);
free(temp_arr);
int i;
for (i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
转载于菜鸟教程
2020.10.19 15:02 深圳
网友评论