算法基础3:归并排序(Merge Sort)
2017-03-16 23:24
495 查看
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 void MergeSort(int a[], int n); void mergesort(int a[], int p, int r, int tmp[]); void merge(int a[], int p, int q, int r, int tmp[]); void showSeq(int a[], int n); int main() { int n, nums[MAXSIZE], i; while (1 == scanf("%d", &n)) { if (0 == n) break; for (i = 0; i < n; i++) scanf("%d", &nums[i]); showSeq(nums, n); MergeSort(nums, n); showSeq(nums, n); } return 0; } void MergeSort(int a[], int n) { int* tmp = (int*)malloc(sizeof(int) * n); // 分配一个n个int大小的数组 mergesort(a, 0, n - 1, tmp); // 开始归并排序 free(tmp); } void mergesort(int a[], int p, int r, int tmp[]) { if (p < r) { int q = (p + r) >> 1; mergesort(a, p, q, tmp); // 排序左半段 mergesort(a, q + 1, r, tmp); // 排序右半段 merge(a, p, q, r, tmp); // 合并 } } void merge(int a[], int p, int q, int r, int tmp[]) { int i = p, j = q + 1, k = p; while (i <= q && j <= r) // 合并两个有序数组 { if (a[i] <= a[j]) tmp[k++] = a[i++]; else tmp[k++] = a[j++]; } while (i <= q) // copy 剩余部分 tmp[k++] = a[i++]; while (j <= r) tmp[k++] = a[j++]; for (i = p; i <= r; i++) // 将排序好的部分复制回原数组 a[i] = tmp[i]; } void showSeq(int a[], int n) { int i = 0; while (i < n) printf("%d ", a[i++]); putchar('\n'); }
相关文章推荐
- 十大基础实用算法补全——归并排序(MergeSort)
- 【DS】排序算法之归并排序(Merge Sort)
- 归并排序(merge sort)算法实现
- Java实现归并排序(Merge-Sort)算法
- Java基础知识强化55:经典排序之归并排序(MergeSort)
- 用Java实现归并排序(Merge-Sort)算法
- 归并排序(merge sort)算法实现
- Java 归并排序(MergeSort)算法实现
- 【算法导论学习-002】归并排序(MergeSort)
- MergeSort(归并排序)算法Java实现
- 归并排序(merge sort)算法实现
- 归并排序(merge sort)算法实现
- 【算法导论】2-2 二路归并排序(分治)merge-sort 和逆序对的问题
- 数据结构和算法分析之排序篇--归并排序(Merge Sort)和常用排序算法时间复杂度比较(附赠记忆方法)
- [算法]——归并排序(Merge Sort)
- 算法---归并排序(Merge Sort)---多版本对比
- 【从零学习经典算法系列】分治策略实例——归并排序(Mergesort)
- Java实现算法归并排序(MergeSort)
- 算法第三次作业(1. 排序。对文件 largeW.txt(下载链接)中的数据,编程实现冒泡排序(方法名:bubbleSort) 与 归并排序(mergeSort),把排序后的结果分别保存到largeW
- 算法-排序-归并排序(MergeSort)分析