企业网站建设前言如何做好营销
执行效果
归并排序的执行效果是这样的:
呃……看不懂吗?没关系,接着往下看介绍
算法介绍
归并排序(Merge Sort)是创建在归并操作上的一种有效的排序算法,效率为 O(n log n)。1945 年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
算法档案
时间复杂度:O(n * logn)
最优时间复杂度:O(n)
平均时间复杂度:O(n * logn)
空间复杂度:O(n)
稳定性:稳定
算法步骤
- 把 n 个元素看成 n 个长度为 1 的有序子表
- 进行两两归并使记录关键字有序,得到 n/2 个长度为 2 的有序子表
- 重复第 2 个步骤直到所有记录归并成一个长度为 n 的有序表为止
算法实现
#include <stdio.h>void merge_sort(int array[], int length);
void merge_sort_recursive(int array[], int reg[], int start, int end);void merge_sort_recursive(int array[], int reg[], int start, int end)
{if (start >= end){return;}int k = start;int length = end - start;int mid = (length / 2) + start;int start1 = start, end1 = mid;int start2 = mid + 1, end2 = end;merge_sort_recursive(array, reg, start1, end1);merge_sort_recursive(array, reg, start2, end2);while (start1 <= end1 && start2 <= end2){reg[k++] = array[zxsq-anti-bbcode-start1] < array[zxsq-anti-bbcode-start2] ? array[start1++] : array[start2++];}while (start1 <= end1){reg[k++] = array[start1++];}while (start2 <= end2){reg[k++] = array[start2++];}for (k = start; k <= end; k++){array[zxsq-anti-bbcode-k] = reg[zxsq-anti-bbcode-k];}
}void merge_sort(int array[], int length)
{int reg[zxsq-anti-bbcode-length];merge_sort_recursive(array, reg, 0, length-1);
}int main(void)
{int array[] = {73, 108, 111, 118, 101, 70, 105, 115, 104, 67, 46, 99, 111, 109};int i, length;length = sizeof(array) / sizeof(array[zxsq-anti-bbcode-0]);merge_sort(array, length);printf("排序后的结果是:");for (i = 0; i < length; i++){printf("%d ", array[zxsq-anti-bbcode-i]);}putchar('\n');return 0;
}
程序实现如下: