排序算法之归并排序
来源:互联网 发布:杭州软件开发招聘 编辑:程序博客网 时间:2024/05/27 03:28
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并方法:1、将n个记录看成是n个长度为一的有序子表。
2、将两两相邻的有序子表进行归并。
3、重复2步骤,直到归并成长度为n的有序表。
#include<stdio.h>#define N 10void merge(int r[],int s[],int x1,int x2,int x3){ int i,j,k; i=x1; //第一部分开始位置 j=x2+1; //第二部分开始位置 k=x1; while((i<=x2)&&(j<=x3)) //当i和j都在要合并的部分中时 if(r[i]<=r[j]) //筛选两部分中较小的元素放到数组s中 { s[k]=r[i]; i++; k++; } else { s[k]=r[j]; j++; k++; } while(i<=x2) //将x1~x2范围内未比较的数顺次加到数组r中 s[k++]=r[i++]; while(j<=x3) s[k++]=r[j++]; //将x2+1~x3范围内未比较的数顺次加到数组r中}void merge_sort(int r[],int s[],int m,int n){ int p; int t[20]; if(m==n) s[m]=r[m]; else { p=(m+n)/2; merge_sort(r,t,m,p); //将r[m]~r[p]归并成有序的t[m]~t[p] merge_sort(r,t,p+1,n); //将r[p+1]~r[n]归并成有序的t[p+1]~t[n] merge(t,s,m,p,n); //将前两部分归并到s[m]~s[n] }}int main(){ int a[N+1],i; printf("请输入10个数:\n"); for(i=1;i<=N;i++) scanf("%d",&a[i]); printf("这10数的顺序是:\n"); for(i=1;i<=N;i++) printf("%5d",a[i]); printf("\n排序后10个数的顺序是:\n"); merge_sort(a,a,1,N); for(i=1;i<=N;i++) printf("%5d",a[i]); return 0;}
阅读全文
0 0
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 新萌的自娱自乐
- c++实验5
- 很久没来,丢一份前阵子做的 10 万连接性能测试 (fibjs, golang, nginx, nodejs)
- 搜索--D
- C语言进阶之const和static的比较分析
- 排序算法之归并排序
- source insight 4.0 怎么显示行号
- Java:静态代理和动态代理
- stm32l4低功耗模式 笔记
- 0519
- Arduino串口接收字符串
- NodeJS实现同步的方法
- 利用信号量实现线程同步
- Kali渗透测试——利用metasploit攻击靶机WinXP SP1