》》 所谓交换,就是根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。
1、冒泡排序
》》 冒泡排序算法的基本思想是:假设待排序表长为 n , 从后往前(或者从前往后)两两比较
相邻元素的值,若为逆序(即 A[ i-1 ] > A[ i ]), 则交换它们,直到序列比较完。执行这样的一次
操作称为“一趟冒泡”。
》》 冒泡排序的代码示例:【从后往前】
// 用冒泡排序法将序列 A 中的元素从小到大排列
void BubbleSort(ElemType A[] , int n ){
// i 表示的是序列 A 中的第一个元素的下标
// j 表示的是序列 A 中的最后一个元素的下标
// i 变量刚开始是从序列 A 中的第一个元素的下标开始,当经过一趟冒泡
// i 变量的起始下标将向后移动一位
for( i=0 ; i < n-1 ; i++){
// flag 变量,主要是用来标识本趟冒泡是否发生了冒泡
boolean flag = false;
// 下面的 for 循环,执行一次,就是一趟冒泡的过程
// j 变量一直从序列的最后一个元素的下标开始
for( j = n -1 ; j > i ; j--){
// 若为逆序
if( A[j-1].key > A[j].key ){
// 若为逆序,则交换
swap( A[j-1] , A[j]) ;
// 标明发生了交换操作
flag = true;
}
}
// 本趟遍历后没有发生交换,说明序列中的元素已经排好序了
if( flag == false){
return ;
}
}
}
2、快速排序【对冒泡排序的改进】
》》 快速排序是对冒泡排序的一种改进。其基本思想是基于分治法的:在待排序表 L[ 1...n ] 中任取出一个元素
pivot 元素作为基准,通过一趟排序将待排序表划分为独立的两部分 L[1....K-1] 和 L[ K+1 ... n ],使得 L[1....K-1]
中所有元素小于 pivot , L[ K+1 ... n ] 中所有元素大于或等于 pivot , 则将 pivot 放在了 L(K) 上,这个过程称作
“一趟快速排序” 。 而后分别递归地对两个子表重复上述过程,直至每个部分内只有一个元素或空为止,即所有的
元素放在了其最终位置上。
》》 快速排序图解
》》 补充:由于快速排序是递归的,需要借助一个递归工作栈来保存每一层递归调用的必要信息,其容量应与
递归调用的最大深度一致。