以下实现的归并排序的空间复杂度O(n),需要O(n)的辅助空间以下实现的归并排序的空间复杂度O(n),需要O(n)的辅助空间以下实现的归并排序的空间复杂度O(n),需要O(n)的辅助空间
- 同一颜色表示排好序的一个块
void Merge(T a[],int low,int mid,int high)
//将有序序列a[low-mid],a[mid+1,high]归并到a[low,high]
自底向上的归并排序:
void MerGesort(T a[],int n)
{
int t=1;
while(t<n)
{
s=t;t=s*2;
for(i=0;i+t<n;i+=t)
Merge(a,i,i+s-1,i+t-1);
if(i+s<n)
Merge(a,i,i+s-1,i+t-1);
}
}
归并排序:
void MerGesort(T a[],int low,int high)
{
if(low>=high) return;
else
{
mid=(low+high)/2;
MergeSort(a,low,mid);
MergeSort(a,mid+1,high);
Merge(a,low,mid,high);
}
}
递归的过程
void Merge(int sourceArr[],int tempArr[], int startIndex, int midIndex, int endIndex){
int i = startIndex, j=midIndex+1, k = startIndex;
while(i!=midIndex+1 && j!=endIndex+1) {
if(sourceArr[i] > sourceArr[j])
tempArr[k++] = sourceArr[j++];
else
tempArr[k++] = sourceArr[i++];
}
while(i != midIndex+1)
tempArr[k++] = sourceArr[i++];
while(j != endIndex+1)
tempArr[k++] = sourceArr[j++];
for(i=startIndex; i<=endIndex; i++)
sourceArr[i] = tempArr[i];
}
T(n)=aT(nb)+f(n)
T(n)=aT(\frac{n}{b})+f(n)
T(n)=aT(bn)+f(n)
则有:{O(nlogba)O(nlogba)>O(f(n))O(f(n)logn)O(nlogba)=O(f(n))O(f(n))O(nlogba)<O(f(n))则有:\begin{cases}
O(n^{log_ba})& { O( n^{log_ba} )>O(f(n))}\\
O(f(n)logn)& { O( n^{log_ba} )=O(f(n))}\\
O(f(n))& { O( n^{log_ba} )<O(f(n))}
\end{cases}
则有:⎩⎨⎧O(nlogba)O(f(n)logn)O(f(n))O(nlogba)>O(f(n))O(nlogba)=O(f(n))O(nlogba)<O(f(n))