归并排序
主要问题在于合并两个数组时候的问题
借鉴http://blog.csdn.net/kimili1987/article/details/8030620中的方法,合并的空间复杂度为O(1),只不过时间上复杂了一些
void Merge(int *a, int p, int r, int q){
int i,j,k,tmp;
/*这是归并两个有序数组的实现*/
for(i=p,j=r+1;j<=q;++i){
if(a[i]>a[j]){
tmp=a[j];
for(k=j;k>i;--k){
a[k]=a[k-1]; //元素逐个后移,类似插入排序
}
a[k]=tmp;
j++;
}
}
}
下面自己写的,合并需要额外临时空间
#include <stdio.h>
#include <stdlib.h>
int A[5]={2,1,5,3,4};
void MergeArray(int A[],int first,int last,int mid)\\ 这一块写的很恶心,用临时空间来搞,自己写的乱死了
{
int i,j,k;
int *temp;
temp=(int*)malloc(sizeof(int)*(last-first));
k=0;
for(i=first,j=mid;i<mid&&j<last;)
{if(A[i]>A[j])
{
temp[k]=A[j];
k++;
j++;
}
else
{
temp[k]=A[i];
k++;
i++;
}
}
while(i<mid)
{
temp[k]=A[i];
k++;
i++;
}
while(j<last)
{
temp[k]=A[j];
k++;
j++;
}
for(k=0,j=first;k<last-first;k++)
{
A[j]=temp[k];
j++;
}
free(temp);
}
void MergeSort(int A[],int first,int last)
{
int mid;
if(first<last-1)
{
mid=(first+last)/2;
MergeSort(A,first,mid);
MergeSort(A,mid,last);
MergeArray(A,first,last, mid);
}
}
int main()
{
int i;
MergeSort(A,0,5);
for(i=0;i<5;i++)
printf("%d",A[i]);
printf("Hello world!\n");
return 0;
}