n个元素排序
分成大小大致相同两组,分别进行排序
void Mergesort(Type a[], int left, int right)
{ if(left < right) {
int i = (left + right) /2;
Mergesort(a, left, i);
Mergesort(a, i+1, right);
Merge(a, b, left, i, right);
Copy(a, b, left, right):
}
}
Merge和Copy可在O(n)时间内完成。 合并排序 最坏时间复杂度:O(nlogn) 平均时间复杂度:O(nlogn) 辅助空间:O(n)
两端向中间,关键字较大的交换到后面单元,关键字较小的交换到前面单元。
template<class Type>
void QuickSort(Type a[], int p, int r)
{ if(p < r) [
int q = Partition(a, p ,r);
QuickSort(a, p, q-1);
QuickSort(a, q+1, r);
}
}
template<class Type>
int Partition(Type a[], int p, int r)
{ int i = p, j = r+1;
Type x = a[p];
while(true) {
while(a[++i] < x);
while(a[++j] > x);
if(i >= j) break;
Swap(a[i], a[j]);
}
a[p] = a[j];
a[j] = x;
return j;
}
函数Partition的计算时间为O(n) 最坏情况,划分分别包含n-1个元素和1个元素。
最好情况,划分基准恰好为中值。
template<class Typa>
int RanddomizedPartition(Type a[], int p, int r)
{ int i = Random(p, r);
Swap(a[i], a[p]);
return Partition(a, p, r);
}
快速排序 最坏时间复杂度:O(n^2) 平均时间复杂度:O(nlogn) 辅助空间:O(n)或O(logn)
|