排序八之合并排序
来源:互联网 发布:如何用java编写计算器 编辑:程序博客网 时间:2024/06/14 04:02
Merge Sort
合并排序算法就是将多个有序数据表合并成一个有序数据表。如果参与合并的只有两个有序表,则称其为二路合并。对于一个原始的待排序序列,往往可以通过分割的方法来实现多路合并排序。
合并排序的基本流程如下:
1:首先将含有n个节点的待排序数据序列看作n个长度为一的有序子表组成,并将它们两两合并,得到长度为二的若干有序子表;
2:然后,在对这些子表进行两两合并,得到长度为四的若干有序子表,……
3:重复上述过程,直到最后子表的长度为n,从而完成排序过程。
#include<stdio.h>#include<stdlib.h>#include<time.h>#define SIZE 15void MergeOne(int a[],int b[],int n,int l){ int i,j; int k,s,e; s=0; while(s+l<n) { e=s+2*l-1; if(e>=n) e=n-1; k=s; i=s; j=s+l; while(i<s+l&&j<=e) { if(a[i]<=a[j]) b[k++]=a[i++]; else b[k++]=a[j++]; } while(i<s+l) b[k++]=a[i++]; while(j<=e) b[k++]=a[j++]; s=e+1; } if(s<n) { for(;s<n;s++) { b[s]=a[s]; } }}void MergeSort(int a[],int n){ int *p; int h,l,f; f=0; l=1; if(!(p=(int *)malloc(sizeof(int)*n))) { printf("内存分配失败!\n"); exit(0); } while(l<n) { if(f==1) MergeOne(p,a,n,l); else MergeOne(a,p,n,l); l=l*2; f=1-f; } if(f) { for(h=0;h<n;h++) a[h]=p[h]; } free(p);}int main(){ int i; int shuzu[SIZE]; srand(time(NULL)); for(i=0;i<SIZE;i++) shuzu[i]=rand()/1000+100; printf("排序后的数组为:\n"); for(i=0;i<SIZE;i++) printf("%d ",shuzu[i]); printf("\n"); MergeSort(shuzu,SIZE); printf("排序后的数组为:\n"); for(i=0;i<SIZE;i++) printf("%d ",shuzu[i]); printf("\n"); return 0;}
0 0
- 排序八之合并排序
- 排序算法之合并排序
- 排序算法之合并排序
- 排序算法之合并排序
- 算法之合并排序
- 递归之合并排序
- Python之合并排序
- 数据结构实验之排序八:快速排序
- 数据结构实验之排序八:快速排序
- 数据结构实验之排序八:快速排序
- 数据结构实验之排序八:快速排序
- 数据结构实验之排序八:快速排序
- 数据结构实验之排序八:快速排序
- 数据结构实验之排序八:快速排序
- 数据结构实验之排序八:快速排序
- 数据结构实验之排序八:快速排序
- 排序算法系列之合并排序
- 简单排序算法之合并排序
- 广西首届网络安全选拔赛 CRYPTO Writeup
- iOS上视频剪辑片段和添加背景音乐
- Watering Grass
- 114. Flatten Binary Tree to Linked List
- 收藏7
- 排序八之合并排序
- MySQL性能优化的最佳20+条经验
- WIN7任务栏大部分图标变空白
- 收藏8
- Java 连接各种数据库
- YARN批处理方式kill Applications解决方案
- 安装以及使用cocoaPods的问题
- DOM基础
- XSS学习分支图