归并排序算法研究
来源:互联网 发布:百度seo关键词优化 编辑:程序博客网 时间:2024/06/08 09:21
最近阅读啦归并排序相关资料,结合自己的理解整理并编程实现进行测试验证。
归并排序利用啦分而治之的思想,将复杂问题转变为简单问题而后进行处理,然后对处理的结果在进行处理,最后得到需要的结果。
归并排序算法的为代码描述如下:
已知array[start..middle-1] and array[middle..end]都已经排好序啦
Merge(array, start, middle, end):
Create left[..] = array[start..middle-1];
right[..] = array[middle..end];
i = j =0;
for k <-- start up to end
if (left[i] <=right[j] and i < middle - start )or j > end - middle
array[k] = left[i++];
else
array[k] = left[j++];
MergeSort(array, start, end):
if start < end
middle = (start + end)/2;
MergeSort(array, start, middle);
MergeSort(array, middle+1, end);
Merge(array, start, middle+1, end);
上述描述为增序排序,降序排序只需要将left[i] <=right[j]改变为left[i] >=right[j]即可。
将上述伪代码用C语言实现,增减type参数以便实现增序排序和将需排序。为了便于清晰了解递归,对于每一步都进行啦打印,显示每次归并的结果。代码如下:
#include <stdio.h>typedef enum{ NON_DECREASE, NON_INCREASE}t_sort;void output_arry(int *array, int n){ int i; for(i = 0; i < n; i++) { printf ("%d ", array[i]); } printf ("\n");}int recursive = 1;void merge(int *array, int start, int middle, int end, t_sort type){ int i,j,k; int *left = (int*)malloc(sizeof(int) * (middle - start)); int *right = (int*)malloc(sizeof(int) * (end - middle + 1)); for(i = 0; i < middle - start; i++) left[i] = array[start + i]; printf ("Left array: "); output_arry(left, middle - start); for(i = 0; i < end - middle + 1; i++) right[i] = array[middle + i]; printf ("Right array: "); output_arry(right, end - middle + 1); for(k = start, i = 0, j = 0; k <= end; k++) { if(type == NON_DECREASE) { if((left[i] <= right[j] && i < middle - start) || j > end - middle) { array[k] = left[i++]; printf ("L: %d\n", array[k]); } else { array[k] = right[j++]; printf ("R: %d\n", array[k]); } } else { if((left[i] >= right[j] && i < middle - start) || j > end - middle) { array[k] = left[i++]; printf ("L: %d\n", array[k]); } else { array[k] = right[j++]; printf ("R: %d\n", array[k]); } } } printf ("--%d Merged array: ", recursive); output_arry(array + start, end - start + 1); free(left); free(right);}void merge_sort(int *array, int start, int end, t_sort type){ int middle; if(start < end) { middle = (start + end)/2; merge_sort(array, start, middle, type); merge_sort(array, middle+1, end , type); merge(array, start, middle+1, end, type); recursive ++; }}intmain(void){ int arry[] = {10,7,8,4,5,2,1,6,3,8}; printf ("The original data is: "); output_arry(arry, sizeof(arry)/sizeof(int)); merge_sort(arry, 0, sizeof(arry)/sizeof(int) - 1, NON_DECREASE); //merge_sort(arry, 0, sizeof(arry)/sizeof(int) - 1, NON_INCREASE); printf ("The sorted data is: "); output_arry(arry, sizeof(arry)/sizeof(int)); return 0;}测试增序排序结果如下:
The original data is: 10 7 8 4 5 2 1 6 3 8 Left array: 10 Right array: 7 R: 7L: 10--1 Merged array: 7 10 Left array: 7 10 Right array: 8 L: 7R: 8L: 10--2 Merged array: 7 8 10 Left array: 4 Right array: 5 L: 4R: 5--3 Merged array: 4 5 Left array: 7 8 10 Right array: 4 5 R: 4R: 5L: 7L: 8L: 10--4 Merged array: 4 5 7 8 10 Left array: 2 Right array: 1 R: 1L: 2--5 Merged array: 1 2 Left array: 1 2 Right array: 6 L: 1L: 2R: 6--6 Merged array: 1 2 6 Left array: 3 Right array: 8 L: 3R: 8--7 Merged array: 3 8 Left array: 1 2 6 Right array: 3 8 L: 1L: 2R: 3L: 6R: 8--8 Merged array: 1 2 3 6 8 Left array: 4 5 7 8 10 Right array: 1 2 3 6 8 R: 1R: 2R: 3L: 4L: 5R: 6L: 7L: 8R: 8L: 10--9 Merged array: 1 2 3 4 5 6 7 8 8 10 The sorted data is: 1 2 3 4 5 6 7 8 8 10测试降序排序结果如下:
The original data is: 10 7 8 4 5 2 1 6 3 8 Left array: 10 Right array: 7 L: 10R: 7--1 Merged array: 10 7 Left array: 10 7 Right array: 8 L: 10R: 8L: 7--2 Merged array: 10 8 7 Left array: 4 Right array: 5 R: 5L: 4--3 Merged array: 5 4 Left array: 10 8 7 Right array: 5 4 L: 10L: 8L: 7R: 5R: 4--4 Merged array: 10 8 7 5 4 Left array: 2 Right array: 1 L: 2R: 1--5 Merged array: 2 1 Left array: 2 1 Right array: 6 R: 6L: 2L: 1--6 Merged array: 6 2 1 Left array: 3 Right array: 8 R: 8L: 3--7 Merged array: 8 3 Left array: 6 2 1 Right array: 8 3 R: 8L: 6R: 3L: 2L: 1--8 Merged array: 8 6 3 2 1 Left array: 10 8 7 5 4 Right array: 8 6 3 2 1 L: 10L: 8R: 8L: 7R: 6L: 5L: 4R: 3R: 2R: 1--9 Merged array: 10 8 8 7 6 5 4 3 2 1 The sorted data is: 10 8 8 7 6 5 4 3 2 1
归并排序的时间复杂度为O(nlgn),从上面的测试结果可以看出相同的数在排序前后,其相对位置没有改变,因此它是一种稳定的排序。
- 归并排序算法研究
- 排序算法-归并排序
- 排序算法------归并排序
- 排序算法-归并排序
- 排序算法---归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 排序算法-归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- C++ rand,srand用法
- MINA框架 中JAVA NIO处理主要逻辑的processor线程
- (转)微软等数据结构+算法面试100题全部答案集锦
- [C++]LeetCode: 37 Construct Binary Tree from Preorder and Inorder Traversal
- Linux下区分物理CPU、逻辑CPU和CPU核数
- 归并排序算法研究
- 黑马程序员———基础视频中涉及的几个设计模式
- 认识高斯分布
- opencv学习笔记(2)
- Linux中部署web项目
- 让写代码变成简单的copy操作,代码生成器之一---------android,findViewById
- Android中this、super的区别
- 先验概率与后验概率的区别
- LeetCode