本文目录一览:
c语言的归并排序的完整程序
这个不难:
#includestdio.h
// 一个递归函数
void mergesort(int *num,int start,int end);
// 这个函数用来将两个排好序的数组进行合并
void merge(int *num,int start,int middle,int end);
int main()
{
// 测试数组
int num[10]= {12,54,23,67,86,45,97,32,14,65};
int i;
// 排序之前
printf("Before sorting:\n");
for (i=0; i10; i++)
{
printf("%3d",num[i]);
}
printf("\n");
// 进行合并排序
mergesort(num,0,9);
printf("After sorting:\n");
// 排序之后
for (i=0; i10; i++)
{
printf("%3d",num[i]);
}
printf("\n");
return 0;
}
//这个函数用来将问题细分
void mergesort(int *num,int start,int end)
{
int middle;
if(startend)
{
middle=(start+end)/2;
// 归并的基本思想
// 排左边
mergesort(num,start,middle);
// 排右边
mergesort(num,middle+1,end);
// 合并
merge(num,start,middle,end);
}
}
//这个函数用于将两个已排好序的子序列合并
void merge(int *num,int start,int middle,int end)
{
int n1=middle-start+1;
int n2=end-middle;
// 动态分配内存,声明两个数组容纳左右两边的数组
int *L=new int[n1+1];
int *R=new int[n2+1];
int i,j=0,k;
//将新建的两个数组赋值
for (i=0; in1; i++)
{
*(L+i)=*(num+start+i);
}
// 哨兵元素
*(L+n1)=1000000;
for (i=0; in2; i++)
{
*(R+i)=*(num+middle+i+1);
}
*(R+n2)=1000000;
i=0;
// 进行合并
for (k=start; k=end; k++)
{
if(L[i]=R[j])
{
num[k]=L[i];
i++;
}
else
{
num[k]=R[j];
j++;
}
}
delete [] L;
delete [] R;
}
C语言的归并算法?
输入参数中,需要排序的数组为array[],起始索引为first,终止索引为last。调用完成后,array[]中从first到last处于升序排列。
void MergeSort(int array[], int first, int last)
{
int mid = 0;
if(firstlast)
{
mid = (first+last)/2;
MergeSort(array, first, mid);
MergeSort(array, mid+1,last);
Merge(array,first,mid,last);
}
}
高分送!!如何用C语言实现归并排序算法!!!
#include iostream
using namespace std;
void merge(int array[],int left,int right)
{
int temparray[right];
for(int j=left;j=right;j++)
{
temparray[j]=array[j];
}
int middle=(left+right)/2;
int index1=left;
int index2=middle+1;
int i=left;
while((index1=middle)(index2=right))
{
if(temparray[index1]temparray[index2]) array[i++]=temparray[index1++];
else array[i++]=temparray[index2++];
}
while(index1=middle) array[i++]=temparray[index1++];
while(index2=right) array[i++]=temparray[index2++];
}
void sort(int array[],int left,int right)
{
if(leftright)
{
int middle=(left+right)/2;
sort(array,left,middle);
sort(array,middle+1,right);
merge(array,left,right);
}
}
这个不是特别的完美,但是大体上就是这么个思路啦~而且因为语法不严谨,貌似只能在c++下运行~建议看看youku上的数据结构课,然后你就会发现全明白了~
如果在c语言下运行,int temparray[right];这句话里面的right要改成你需要用的数~
如何用C语言编一个归并排序的程序
#include "MergeSort.h"
#include iostream
using namespace std;
MergeSort::MergeSort(vectorint _list, int _len)
{
list.push_back(0);
link.push_back(0);
for (int i=0; i_len; i++) {
list.push_back(_list[i]);
link.push_back(0);
}
this-len = _len;
}
//9 归并排序:递归-----------------------------------------------------------
//具体方法:以merger_link[]提供链表功能。merger_link[i]对应在有序子序列中
//merger_list[i]后一个结点在原merger_list[]中的下标;
//merger_link[0]总是表示有序子序列开始的结点在merge_list[]中的下标;
//st1,st2为两个有序序列的第一个结点;
//将他们归并,并返回其第一个结点的下标,即merger_link[0]
int MergeSort::list_merge(int st1, int st2)
{
int k = 0, i = st1, j = st2;
while (i j) //当两序列未检测完
if (list[i] = list[j]) //将merge_list[i]和merge_list[j]
{ //中小的连接到merger_link[k]后
link[k] = i;
k = i;
i = link[i];
}else
{
link[k] = j;
k = j;
j = link[j];
}
if (!i) link[k] = j; //将剩余未检测完的merge_list[]
else link[k] = i; //连接到merger_link[k]后
return link[0];
}
int MergeSort::merge_sort(int left, int right)
{
if (left=right) return left;
int middle = (left + right)/2;
//对左右两子序列进行归并
return list_merge(merge_sort(left,middle), merge_sort(middle+1,right));
}
void MergeSort::out()
{
int i = link[0];
int j = 0;
while (i)
{
j++;
cout list[i] " ";
i = link[i];
if (j%18 == 0) cout endl;
}
cout endl;
}