1、基本思想:将无序数组R[1...n]垂直排列,从下往上扫描数组R,对比相邻的两个元素,如果上面的元素值小于下面的值,则调整这两个相邻元素的位置,然后继续向上扫描,直到排好序为止。
2、排序过程:
(1)初始化:读取无序数组R[1...n]
(2)第一趟扫描:从数组R底部开始向上扫描,依次比较相邻的两个元素,若发现数值较小的在上面,则交换两个元素的位置。即依次比较(R[n]、R[n-1])、(R[n-1]、R[n-2])、。。。、(R[2]、R[1]),对于每对元素(R[j]、R[j+1]),若R[j+1].key < R[j].key,则交换R[j+1]和R[j]的内容。
第一趟扫描完毕,关键字最小的元素在第一个位置R[1]。
(3)第二趟扫描:扫描R[2...n],扫描完毕时,关键字次小的元素在第二个位置R[2]
最后,经过n-1趟扫描可得到有序数组R[1...n]
注:若发现某趟扫描中,没有元素进行位置交换,说明所有元素处于有序状态,该趟扫描结束后可以停止排序。因此,可以引入一个布尔量exchange,每趟扫描前,将exchange置为false,如果排序过程(即扫描过程)发生了元素交换,则将exchange置为true,每趟扫描结束后检查exchange,若exchange为false,则终止算法,不再进行下一趟排序。
3、代码如下:
void BubbleSort(SeqList R) { int i,j; Boolean exchange; for(int i = 1; i < n; i++) { exchange=false; for(j=n-1;j >= i; j--) { if(R[j+1].key < R[j].key) { R[0]=R[j]; R[j]=R[j+1]; R[j+1]=R[0]; exchange=TRUE; } if(!exchange) return; } } }
冒泡排序是稳定的排序,最坏时间复杂度为O(n^2),最好时间复杂度为O(n),平均时间复杂度为O(n^2),空间复杂度为O(1)。
摘至程序员面试宝典,侵权必删。
时间: 2024-10-03 18:10:41