300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 对归并排序进行c语言编程实现 归并排序及C语言实现

对归并排序进行c语言编程实现 归并排序及C语言实现

时间:2022-10-12 23:37:21

相关推荐

对归并排序进行c语言编程实现 归并排序及C语言实现

排序系列之(1)归并排序及C语言实现

有很多算法在结构上是递归的:为了解决一个给定的问题,算法需要一次或多次递归的调用其本身来解决相关的问题。这些算法通常采用分治策略:将原问题划分成n个规模较小而结构与原问题相似的子问题;递归的解决这些子问题,然后将结果合并,就能得到原问题的解。

分治模式在递归时一般都有三个步骤

分解:将原问题分解成一系类子问题

解决:递归的解各子问题。若子问题足够小,则直接求解。

合并:将子问题的结果合并成原问题的解。

归并排序在算法上完全依照了上述模式,操作如下。

分解:将n个元素分解成n/2个元素的子序列

解决:用合并排序法对两个子序列递归地排序

合并:将子问题的结果合并原问题的解。

以下是源代码实现

view plaincopy to clipboardprint?

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++];

copyArray(b,a,newArrayLen,left);

free(b);

}

/**

* 复制数组

* source:源数组

* dest:目标数组

* len:源数组长度

* first:目标数组起始位置

*

*/

void copyArray(int source[], int dest[],int len,int first)

{

int i;

int j=first;

for(i=0;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);

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。