简单·排序
前提
void X_sort ( ElementType A[], int N )
- 大多数情况下,为简单起见,讨论从小到大的整数排序
- N是正整数
- 只讨论基于比较的排序(> = <有定义)
- 只讨论内部排序
- 稳定性:任意两个相等的数据,排序前后的相对位置不发生改变
- 没有一种排序是任何情况下都表现最好的
冒泡排序
void Bubble_Sort( ElementType A[], int N )
{
for( P=N-1; P>=0; P-- ) {
flag = 0;
for( i=0; i<P; i++ ) {
if( A[i] > A[i+1] ) {
Swap(A[i],A[i+1]);
flag = 1;
}
}
if( flag==0 ) break;
}
}
- 最好情况:顺序 T = O(N)
- 最坏情况:逆序 T = O(N^2)
插入排序
void Insertion_Sort( ElementType A[], int N )
{
for ( P=1; P<N; P++ ) {
Tmp = A[P];
for( i=P; i>0 && A[i-1]>Tmp; i-- )
A[i] = A[i-1];
A[i] = Tmp;
}
}
- 最好情况:顺序 T = O(N)
- 最坏情况:逆序 T = O(N^2)
时间复杂度下界
- 对于下标 i<j,如果A[i]>A[j],则称(i,j)是一对逆序对(inversion)
- 交换2个相邻元素正好消去1个逆序对!
- 插入排序:T(N,I) = O(N+I)
- 定理:任意N个不同元素组成的序列平均具有N(N-1)/4个逆序对。
- 定理:任何仅以交换相邻两元素来排序的算法,其平均时间复杂度为
Ω
(
N
2
)
\Omega(N^2)
Ω(N2)。
- 这意味着:要提高算法效率,我们必须