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

Python010

c语言的归并排序的完整程序,第1张

这个不难:

#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=0i<10i++)

{

printf("%3d",num[i])

}

printf("\n")

// 进行合并排序

mergesort(num,0,9)

printf("After sorting:\n")

// 排序之后

for (i=0i<10i++)

{

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=0i<n1i++)

{

*(L+i)=*(num+start+i)

}

// 哨兵元素

*(L+n1)=1000000

for (i=0i<n2i++)

{

*(R+i)=*(num+middle+i+1)

}

*(R+n2)=1000000

i=0

// 进行合并

for (k=startk<=endk++)

{

if(L[i]<=R[j])

{

num[k]=L[i]

i++

}

else

{

num[k]=R[j]

j++

}

}

delete [] L

delete [] R

}

#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 = 1i <= 10i++)

scanf("%d", &a[i])

/*从键盘中输入10个数*/

merge_sort(a, a, 1, 10) /*调用merge_sort函数进行归并排序*/

printf("the sorted numbers:\n")

for (i = 1i <= 10i++)

printf("%5d", a[i])

/*将排序后的结构输出*/

}