简单排序(冒泡,插入)
介绍两大类算法,一类是排序,一类是查找
前提:X是排序的算法 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 (n2)
A可以是数组 ,可以是链表。
插入排序
类似于扑克牌排序。
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 (n2)
时间复杂度下界
定理:任意N个不同元素组成的序列平均具有N(N-1)/4个逆序对。
定理:任何仅以交换相邻逆序对来排序的算法,其平均时间复杂度是Ω(N2).
时间: 2024-10-24 11:43:22