当前位置:首页 » 编程语言 » 归并排序c语言实现
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

归并排序c语言实现

发布时间: 2022-01-28 17:29:46

1. c语言 归并排序的完整代码

#include<stdio.h>
voidmain()
{
inti,j,k,n=4,a[9]={1,3,5,7,9},b[]={2,4,6,8};
for(i=0;i<4;i++)
for(j=0;j<n+1;j++)
{
if(b[i]<a[j])
{
for(k=++n;k>j;k--)
a[k]=a[k-1];
a[j]=b[i];
break;
}
}
for(i=0;i<9;i++)
printf("%d",a[i]);
}

2. 用c语言编写归并排序代码,要求易懂,本人只是c语言的初学者,越简单越好。

//#include<iostream>
//
//using namespace std;
//
//void Guibing(int*arr,int low,int high)
//{
// int m_Begin1 = low;
// int m_End1 = (low+high)/2;
// int m_Begin2 = m_End1+1;
// int m_End2 = high;
//
// int* temp = new int[high-low+1];
// //申请一个这两组的空间
// //要看 只要有一组到结尾就要结束
// int k=0;
// for (;m_Begin1 <= m_End1 && m_Begin2 <= m_End2;k++)
// {
// // 然后找小的往里存
// if (arr[m_Begin1] < arr[m_Begin2])
// {
// temp[k] = arr[m_Begin1];
// m_Begin1++;
// }
// else
// {
// temp[k] = arr[m_Begin2];
// m_Begin2++;
// }
// }
//
// //如果第一组没到结尾 顺序存
// while(m_Begin1 <= m_End1)
// {
// temp[k] = arr[m_Begin1];
// k++;
// m_Begin1++;
// }
// //如果第二组没到结尾 顺序存
// while(m_Begin2 <= m_End2)
// {
// temp[k] = arr[m_Begin2];
// k++;
// m_Begin2++;
// }
// //把已经排好序的 temp 放回到原来对应的位置
// for (k = 0;k<high-low+1;k++)
// {
// arr[low+k] = temp[k];
// }
// delete[] temp;
//}
//
//void Digui(int*arr,int low,int high)
//{
// if (low < high)
// {
// int mid = (low+high)/2;
// Digui(arr,low,mid);
// Digui(arr,mid+1,high);
// Guibing(arr,low,high);
// }
//}
//
//int main()
//{
// int arr[10] = {9,11,5,3,17,13,1,17,25,8};
//
// Digui(arr,0,9);
//
// for (int i =0 ;i<10;i++)
// {
// cout << arr[i] << " ";
// }
//
// system("pause");
// return 0;
//}

3. 高分送!!如何用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(left<right)
{
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要改成你需要用的数~

4. c语言的归并排序的完整程序

这个不难:

#include<stdio.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; i<10; i++)
{
printf("%3d",num[i]);
}
printf("\n");
// 进行合并排序
mergesort(num,0,9);
printf("After sorting:\n");
// 排序之后
for (i=0; i<10; i++)
{
printf("%3d",num[i]);
}
printf("\n");
return 0;
}

//这个函数用来将问题细分

void mergesort(int *num,int start,int end)
{
int middle;
if(start<end)
{
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; i<n1; i++)
{
*(L+i)=*(num+start+i);
}
// 哨兵元素
*(L+n1)=1000000;
for (i=0; i<n2; 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;
}

5. 归并排序C语言版

#include <stdio.h>
void 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)
/*将x2+1~x3范围内的未比较的数顺次加到数组r中*/
s[k++] = r[j++];
}
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);
/*递归调用merge_sort函数将r[m]~r[p]归并成有序的t[m]~t[p]*/
merge_sort(r, t, p + 1, n); /*递归调用merge_sort函数将r[p
+1]~r[n]归并成有序的t[p+1]~t[n]*/
merge(t, s, m, p, n); /*调用函数将前两部分归并到s[m]~s[n]*/
}
}
main()
{
int a[11];
int i;
printf("please input 10 numbers:\n");
for (i = 1; i <= 10; i++)
scanf("%d", &a[i]);
/*从键盘中输入10个数*/
merge_sort(a, a, 1, 10); /*调用merge_sort函数进行归并排序*/
printf("the sorted numbers:\n");
for (i = 1; i <= 10; i++)
printf("%5d", a[i]);
/*将排序后的结构输出*/
}


6. 给定一个数列,如何用归并排序算法把它排成升序,用c语言实现。

#include <iostream>
#include <cstdio>
using namespace std;
#define N 100
int temp[N];
void msort(int *a, int l , int r)
{//两段合并,初始i j, 分别指向二者之中最小元素,选出两个中较小的,存入temp,然后移到下一个
if (l == r) return;
int i, j, k, m = (l+r) >> 1;
msort(a, l, m) ; msort(a, m+1, r);
for ( i = l , j= m+1, k = l; k <= r; ++k )
{
if (i <= m && a[i] <= a[j] || j > r ) { temp[k] = a[i++]; }
else { temp[k] = a[j++]; }

}
memcpy( a+ l, temp + l, (r-l+1) * sizeof(a[0]));
return ;
}
int main()
{
while (1)
{
int a[N] = {0};
int n = 5, i = 0;
while (n--)
{
scanf("%d", &a[i++]);
}
i = 0;
msort(a, 0, 4);
for (i = 0; i < 5; i++)
{
printf("%d " , a[i]);
}
puts("");
}
}
//附带main()函数以供测试,输入五个元素,无序或者有序,然后按升序输出

7. C语言归并排序代码

void mergeSort(int a[],int left,int right)
{
int i;
// 保证至少有两个元素
if(left < right)
{
i = (left+right)/2;
mergeSort(a,left,i);
mergeSort(a,i+1,right);
merge(a,left,right);
}
}
void merge(int a[],int left,int right)
{
int begin1 = left;
int mid = (left+right)/2 ;
int begin2 = mid+1;
int k=0;
int newArrayLen = right-left+1;
int *b = (int*)malloc(newArrayLen*sizeof(int));
while(begin1<=mid && begin2<=right)
{
if(a[begin1]<=a[begin2])
b[k++] = a[begin1++];
else
b[k++] = a[begin2++];
}
while(begin1<=mid)
b[k++] = a[begin1++];
while(begin2<=right)
b[k++] = a[begin2++];
Array(b,a,newArrayLen,left);
free(b);
}
/**
* 复制数组
* source:源数组
* dest:目标数组
* len:源数组长度
* first:目标数组起始位置
*
*/
void Array(int source[], int dest[],int len,int first)
{
int i;
int j=first;
for(i=0;i<len;i++)
{
dest[j] = source[i];
j++;
}
}
void mergeSortTest()
{
int a[] = {5, 18, 151, 138, 160, 63, 174, 169, 79, 200};
int len = sizeof(a)/sizeof(int);
showArray(a,len);
mergeSort(a,0,len-1);
showArray(a,len);
}

8. c语言归并排序

直接上源码,仅供参考:
#include<stdio.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; i<10; i++)
{
printf("%3d",num[i]);
}
printf("\n");
// 进行合并排序
mergesort(num,0,9);
printf("After sorting:\n");
// 排序之后
for (i=0; i<10; i++)
{
printf("%3d",num[i]);
}
printf("\n");
return 0;
}

//这个函数用来将问题细分

void mergesort(int *num,int start,int end)
{
int middle;
if(start<end)
{
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; i<n1; i++)
{
*(L+i)=*(num+start+i);
}
// 哨兵元素
*(L+n1)=1000000;
for (i=0; i<n2; 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;
}

9. c语言 归并排序。。。。。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void Merge(int *R,int low,int m,int high)
{
int i=low,j=m+1,p=0;
int *R1;
R1=(int *)malloc((high-low+1)*sizeof(int));
if(!R1)
return;
while(i<=m&&j<=high)
R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];
while(i<=m)
R1[p++]=R[i++];
while(j<=high)
R1[p++]=R[j++];
for(p=0,i=low;i<=high;p++,i++)
R[i]=R1[p];
}
void MergeSort(int R[],int low,int high)
{
int mid;
if(low<high)
{
mid=(low+high)/2;
MergeSort(R,low,mid);
MergeSort(R,mid+1,high);
Merge(R,low,mid,high);
}
}
int main(void)
{
int i;
int a[10]=;
int low=0,high=9;
srand( (unsigned int)time(NULL) );
for (i = 0; i < 10; i++)
{
a[i] = rand() % 100;
}
MergeSort(a,low,high);
for(i=low;i<=high;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}

10. 用C语言编一个归并排序的程序

/**设个有序关键字表s1=(18,25,37,42),s2=(20,33,40).同时将s1,s2存储在数组r[1...7]中
**s1放r[1..4],s2放[5..7],现要归并到一维数组r2[1..7]中,只要依次比较这两个有序
**表中相应记录关键字,按取小原则复制到r2中
**/
#include<stdio.h>
#define MAXITEM 100
typedef struct rec
{
int key;
char data[20];
}elemnode[MAXITEM];

void merge(elemnode r,elemnode r1,int l,int m,int h)
{ // i,j是r的指示器,i的取值从l到m, j的取值从m+1到h,k是r1的指示器
int i = l,j = m+1,k = l;

while(i<=m && j<=h)
{
if(r[i].key<=r[j].key)
{
r1[k] = r[i];
i++;
}
else
{
r1[k] = r[j];j++;
}
k++;
}
if(i>m)
while(j<=h)
{
r1[k] = r[j];
j++;
k++;
}
else
while(i<=m)
{
r1[k] = r[i];
i++;
k++;
}
}

void mergepass(elemnode r,elemnode r1,int n,int l)
{
//将r中长度为L的两个部分合并,第一部分从p到期(p+l-1)
//第二部分从 p+1到(p+2*l-1)
int p = 1;
while(n-p+1>2*l)
{
merge(r,r1,p,p+l-1,p+2*l-1);
p+=2*l; //p向后移动2*l,准备下一次合并
}
if(n-p+1>l) //一个长度为l的部分与一个长度小于l的部分合并
merge(r,r1,p,p+l-1,n);
else //只剩下一个长度不大于l的部分,将其复制到r1
for(;p<=n;p++) r1[p] = r[p];
}

void mergesort(elemnode r,elemnode r1,int n)
{//对r中数据元素进行归并,结果仍放在r 中
int l = 1;
while(l<n)
{
mergepass(r,r1,n,l);l*=2;
mergepass(r1,r,n,l);l*=2;
}
}
void disp(elemnode r,int n)
{
int i;
for(i=1;i<=n;i++)
printf("%6d",r[i].key);
printf("\n");
for(i=1;i<=n;i++)
printf("%6s",r[i].data);
printf("\n");
}
void main()
{
elemnode s = {{0," "},{75,"王华"},{87,"李英"},{68,"张萍"},{92,"陈涛"},{88,"刘丽"},{61,"章强"},
{77,"孙军"},{96,"朱斌"},{80,"许伟"},{72,"曾亚"}};
elemnode s1;
int n = 10;
mergesort(s,s1,n);
disp(s,n);
}