冒泡排序
算法思想:自下往上依次比较取最小。
基本思想:交换排序:两两比较待排序记录的关键字,发现两个纪录的次序相反时即进行交换,直到没有反序的记录为止。
算法执行:自下向上扫描,依次比较相邻两个气泡的重量,若轻者在下,重者在上,则置换两者位置,使其向上漂浮。一次扫描结束后,最轻的气泡便漂浮在该区间的最顶部,这时只有顶部一个位置是有序的。二次扫描,将次轻的气泡向上漂浮至有序区间下面的位置。如是往复,直至所有位置都是有序的。对于n个元素的文件来说,顶多扫描n-1趟,若某一趟扫描中,没有发生任何位置交换,则证明文件已经有序,可提前终止算法。
算法性能:记录移动次数较多,故平均时间性能比直接插入排序差得多。
算法稳定性:稳定排序。
代码实现:
1
void BubbleSort(SeqList R, int n)
2
{
3
// R[1..n]是待排序文件,采用自下向上扫描,对R做冒泡排序
4
int i,j;
5
bool exchange;
6
for(int i=1; i<n; i+++) // 最多做n-1趟排序
7
{
8
exchange=false; // 置换标志,本趟未扫描前,置为false;
9
for(j=n-1; j>=i; j--) // 自下向上扫描
10
{
11
if(R[j].key<R[j-1].key) // 位置置换
12
{
13
R[0]=R[j-1];
14
R[j-1]=R[j];
15
R[j]=R[0];
16
exchange=true; // 若发生了位置置换,置标志为true;
17
}
18
}
19
if(!exchange) // 若本趟排序未发生位置置换,提前终止算法
20
return;
21
}
22
}
23