以下实现的归并排序的空间复杂度 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
)
=
a
T
(
n
b
)
+
f
(
n
)
T(n)=aT(\frac{n}{b})+f(n)
T(n)=aT(bn)+f(n)
则有:
{
O
(
n
l
o
g
b
a
)
O
(
n
l
o
g
b
a
)
>
O
(
f
(
n
)
)
O
(
f
(
n
)
l
o
g
n
)
O
(
n
l
o
g
b
a
)
=
O
(
f
(
n
)
)
O
(
f
(
n
)
)
O
(
n
l
o
g
b
a
)
<
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))