交换排序之冒泡排序

来源:互联网 发布:php 删除cookie 编辑:程序博客网 时间:2024/05/17 22:38

交换排序的基本思想是,两两比较待排序记录的键,发现两个记录的次序相反时即进行交换,直到没有反序的记录位置。

应用交换排序基本思想的主要排序方法有冒泡排序快速排序

1.冒泡排序

基本思想

依次比较相邻的两个数,将小数放在前面,大数放在后面。

第1趟:

  首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。

第2趟:

  仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。

如此下去,重复以上过程,直至最终完成排序。

由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。


下面是代码实现:

template<class Type>void bubble_sort(Type *Array,int n){bool exchange;for (int i = 0 ; i<n ; i++){exchange = false;;//int temp;for(int j = 0; j<n-i ; j++){if (Array[j]>Array[j+1]){swap(Array[j],Array[j+1]);exchange = true;}}if (!exchange)//若不加此判断,则即使在循环结束前数据已经有序,还是会继续排序。{return;}}}
分析

     因为每一趟排序都使有序区增加了一个气泡,在经过n-1趟排序之后,有序区中就有n-1个气泡,而无序区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行n-1趟排序。
     若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。为此,在下面给出的算法中,引入一个布尔量exchange,在每趟排序开始前,先将其置为false。若排序过程中发生了交换,则将其置为true。各趟排序结束时检查exchange,若未曾发生过交换说明已经完成排序则终止算法,不再进行下一趟排序。

1、时间复杂度

若记录序列的初始状态为"正序",则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次交换,且不移动记录;反之,若记录序列的初始状态为"逆序",则需进行n(n-1)/2次比较和记录移动。因此冒泡排序总的时间复杂度为O(n*n)(即n的平方)。

虽然冒泡排序不一定要进行n-1次。但由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多。

2、空间复杂度

在冒泡排序的过程中,设置一个变量用来交换元素,所以空间复杂度为O(1)

3、排序稳定性

冒泡排序是稳定的。

双向冒泡排序

  又叫鸡尾酒排序算法,和冒泡排序的“编程复杂度”一样,但对随机序列排序性能稍高于普通冒泡排序,但是因为是双向冒泡,每次循环都双向检查,极端环境下会出现额外的比较,导致算法性能的退化,比如“4、5、7、1、2、3”这个序列就会出现退化。

template<class Type>void bubble_sort2(Type *Array,int n){int low = 0,high = n - 1;int exchange = 1;while (low<high && exchange){exchange = 0;for (int i = low ; i < high ; i++){if (Array[i]>Array[i+1]){swap(Array[i],Array[i+1]);exchange = 1;}}high--;for (int j = high;j>low; j--){if (Array[j]<Array[j-1]){swap(Array[j],Array[j-1]);exchange = 1;}}low++;}}


下一篇:交换排序之快速排序。http://blog.csdn.net/majianfei1023/article/details/7289184


原创粉丝点击