C语言归并排序代码

Python016

C语言归并排序代码,第1张

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

{

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)

}

#include <stdio.h>

int main()

{int a[]={1,3,5,7,9},b[]={2,4,6,8},c[10]

int i,j,k,n1,n2,n3

i=j=k=0

n1=5

n2=4

n3=n1+n2

for(i<n1&&j<n2)

if(a[i]<b[j])c[k++]=a[i++]

else c[k++]=b[j++]

for(i<n1)c[k++]=a[i++]

for(j<n2)c[k++]=b[j++]

for(k=0k<n3k++)

printf("%d ",c[k])

printf("\n")

return 0

}

给你一个归并排序的具体算法和分析:

两路归并排序算法思路:

①.

把n个记录看成n个长度为l的有序子表

②.

进行两两归并使记录关键字有序,得到n/2个长度为2的有序子表

③.

重复第②步直到所有记录归并成一个长度为n的有序表为止

具体算法:

//

归并操作

template

static

void

merge

(typearray[],

int

p,

int

q,

int

r){

int

i

,

k

int

begin1

,

end1

,

begin2

,

end2

int*

temp

=

(int*)malloc((r-p)*sizeof(int))

begin1

=

p

end1

=

q

begin2

=

q+1

end2

=

r

k

=

0

while

(begin1

<=

end1

&&

begin2

<=

end2){

if

(array[begin1]

<

array[begin2]){

temp[k]

=

array[begin1]

begin1

++

}

else{

temp[k]

=

array[begin2]

begin2

++

}

k

++

}

while

(begin1

<

end1)

temp[k++]

=

array[begin1++]

while

(begin2

<

end2)

temp[k++]

=

array[begin2++]

for

(i

=

0

i

<

(r-p)

i

++)

array[p+i]

=

temp

free(temp)

}

//--------------------------------------------------------------------------------

template

void

mergesort(typearray[],

unsigned

int

first,

unsigned

int

last){

int

mid

=

0

if

(first

<

last)

{

mid

=

(first+last)/2

mergesort

(array,

first,

mid)

mergesort

(array,

mid+1,

last)

merge

(array,

first,

mid,

last)

}

}