归并排序总结
最近学习《算法导论》,看到第二章中给出的归并排序的伪代码(给出的是合并的那一部分,不包括递归的伪代码),后想将其实现,在实现的过程中,遇到一些问题,比如在划分的两个数组中设置哨兵,算法导论中这样给出的:left[n1]<—∞,当时不知道如何去设置这个哨兵,后来通过查资料,发现只需要定义一个宏常数,比较大的常数赋值给哨兵即可。下面给出算法导论的对于合并部分的伪代码(归并排序主要分三部分,分解(分成左右两个数组)—>(解决)对于每个数组进行排序—>合并):
完整代码如下:
#include<iostream.h>
#define N 100
#define INT_MAX 1e9
void mergeSort(int arr[],int first,int mid,int last)
{
int n1=mid-first+1;
int n2=last-mid;
int left[N],right[N];
for (int i=0;i<n1;i++)
{
left[i]=arr[first+i];
}
for (int j=0;j<n2;j++)
{
right[j]=arr[mid+j+1];
}
left[n1]=right[n2]=INT_MAX;
i=j=0;
for (int k=first;k<=last;k++)
{
if (left[i]<=right[j])
{
arr[k]=left[i];
i++;
}
else
{
arr[k]=right[j];
j++;
}
}
}
void sort_merge(int arr[],int first,int last)
{
int mid=0;
if (first<last)
{
mid=first/2+last/2;
sort_merge(arr,first,mid);
sort_merge(arr,mid+1,last);
mergeSort(arr,first,mid,last);
}
}
int main(int argc, char* argv[])
{
int arr[]={6,2,8,22,98,76,54};
int first=0;
int last=sizeof(arr)/sizeof(int);
sort_merge(arr,first,last);
cout<<"排序后的数组:";
for(int j=0;j<last;j++)
{
cout<<arr[j]<<"\t";
}
cout<<endl;
return 0;
}
运行结果:
归并排序的时间复杂度为O(nlg(n)),是一种稳定的排序算法!
仅供参考,欢迎指错!