目录
交换排序
复习提示
所谓交换,是指根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。
基于交换的排序算法很多,本书主要介绍冒泡排序和快速排序,其中冒泡排序算法比较简单,一般很少直接考查,通常会重点考查快速排序算法的相关内容。
1.冒泡排序
1.1基本思想
冒泡排序的基本思想是:
- 从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]),则交换它们,直到序列比较完。
- 我们称它为第一趟冒泡,结果是将最小的元素交换到待排序列的第一个位置(或将最大的元素交换到待排序列的最后一个位置),
- 关键字最小的元素如气泡一般逐渐往上“漂浮”至“水面”(或关键字最大的元素如石头一般下沉至水底)。
- 下一趟冒泡时,前一趟确定的最小元素不再参与比较,每趟冒泡的结果是把序列中的最小元素(或最大元素)放到了序列的最终位置……这样最多做n-1趟冒泡就能把所有元素排好序。
图 8.3所示为冒泡排序的过程,
第一趟冒泡时:
,不交换;
- 13<27,不交换;
- 76>13,交换;
- 97>13,交换;
- 65>13,交换;
- 38>13,交换;
- 49>13,交换。
通过第一趟冒泡后,最小元素已交换到第一个位置,也是它的最终位置。
第二趟冒泡时对剩余子序列采用同样方法进行排序,如此重复,到第五趟结束后没有发生交换,说明表已有序,冒泡排序结束。
1.2算法代码
冒泡排序算法的代码如下:
void BubbleSort(ElemType A[],int n){
for(int i=0;i<n-1;i++){
bool flag=false; //表示本趟冒泡是否发生交换的标志
for(int j=n-1;j>i;j--) //一趟冒泡过程
if(A[j-1]>A[j]){ //若为逆序
swap(A[j-1],A[j]); //使用封装的 swap 函数交换
flag=true;
}
if(flag==false)