用c语言实现归并排序
来源:互联网 发布:荣威车质量怎么样知乎 编辑:程序博客网 时间:2024/05/24 01:43
分治模式的三个步骤:分解,解决,合并。在解决步骤中,算法递归地调用自身,以解决问题
归并排序算法遵循分治模式。
//merge_sort(A,p,r):2.3.1 in <introduction to algorithms>
#include<stdio.h>
#include<stdlib.h>
//merge 2 ordered lists into 1 list:a[low..mid] and a[mid+1..high]-->a[low..high]
//here is a sentinel in the end of each list, it can reduce checks and improve effectiveness
//given that max number is less than 1000000
void merge(int * a,int low,int mid,int high)
{
int left,right,i,j,k;
left=mid-low+1;
right=high-mid;
//下边两个数组,设置了哨兵,简化了比较过程
int * right_list=(int *)malloc((right+1)*sizeof(int));
int * left_list=(int *)malloc((left+1)*sizeof(int));
if(left_list==NULL || right_list==NULL)
{
return ;
}
for(i=0;i<left;i++)
{
left_list[i]=a[low+i];
}
for(j=1;j<=right;j++)
{
right_list[j-1]=a[mid+j];
}
//2个哨兵,假设情况是数组中的元素都小于1000000,在算法导论中为无穷大
//大家需根据实际情况设置
left_list[left]=1000000;
right_list[right]=1000000;
i=0;
j=0;
for(k=low;k<=high;k++)
{
//下边的一行代码与注释代码意义相同,都是进行二路归并的
a[k]=((left_list[i]<right_list[j])?(left_list[i++]):(right_list[j++]));
/*
if(left_list[i]<right_list[j])
{
a[k]=left_list[i];
i++;
}
else
{
a[k]=right_list[j];
j++;
}
*/
}
}
//二路归并排序 a[low..high],其中,特殊情况a【0,length-1】为对整个数组排序
void merge_sort(int *a, int low,int high)
{
int mid;
if (low<high)
{
mid=(low+high)/2;
merge_sort(a,low,mid); //前半部分归并
merge_sort(a,mid+1,high); // 后半部分归并
merge(a,low,mid,high);//进行归并
}
}
int main()
{
int a[14]={3,8,22,4,2,9,14,12,0,1,11,15,13,18};
int i;
printf("Before merge sort: ");
printf("\n");
for(int i=0;i<14;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
merge_sort(a,0,13);
printf("After merge sort: ");
printf("\n");
for(i=0;i<14;i++)
{
printf("%d\t",a[i]);
}
printf("\n");
return 0;
}
最终结果:
- 用C语言实现归并排序
- 用c语言实现归并排序
- 归并排序 c语言实现
- 归并排序C语言实现
- 归并排序C语言实现
- 归并排序--C语言实现
- 归并排序C语言实现
- 归并排序--c语言实现
- C语言实现归并排序
- 归并排序 --C语言实现
- 排序(6)---------归并排序(C语言实现)
- 归并排序及C语言实现
- 归并排序递归实现C语言
- 归并排序非递归实现C语言
- 归并排序 MergeSort C语言实现
- C语言实现的归并排序
- 归并排序C语言实现MergeSort
- 归并排序的C语言实现
- ubuntu12.04安装ant1.9.2
- Android ListView onitemclick事件无响应
- Android4.2.2 Gallery2源码分析(9)——三个界面的跳转
- 为myeclipse打造自己的配色方案
- 关于JavaScript在Android4.0平台以上的混淆问题
- 用c语言实现归并排序
- 轻松掌握SQL Sever中各种语句的完整语法
- Oracle OS认证以及口令文件
- win7下搭建qt+opencv编程环境详细步骤...我的血泪史,希望能帮到正在学习的人!
- lua的FFI库--alien
- 看小米魅族对比视频想到的
- mysql数据库安装+完整删除
- 基于live555的视频直播
- lightoj1038 - Race to 1 Again(概率DP)