交换排序之冒泡排序
来源:互联网 发布: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
- 交换排序之冒泡排序
- 交换排序之冒泡排序
- 交换排序之冒泡排序
- 交换排序之冒泡排序
- 交换排序之冒泡排序
- 交换排序之冒泡排序
- 交换排序之冒泡排序
- 交换排序之冒泡排序
- 交换排序之冒泡排序
- 交换排序之冒泡排序
- 交换排序之冒泡排序
- 交换排序之冒泡排序
- 交换排序之冒泡排序
- 交换排序之冒泡排序
- 交换排序之--冒泡排序
- 交换排序之冒泡排序
- 交换排序之--冒泡排序,快速排序
- 八大排序 -- 交换排序之【冒泡排序】
- 近日开始学习SEO,发现很多以往忽略的致命错误
- Internet Explorer无法打开网页
- css3简介
- SQL删除重复数据的一种方法(亲测)
- php输出XML页面头部代码
- 交换排序之冒泡排序
- Linux下Oracle的安装
- 解决ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
- android 使用XmlResourceParser 解析XML
- TinyOS Storage debug record
- Vector Clock
- 交换排序之快速排序
- Codeforces Round #108 (Div. 2)
- 第7题 倒置一个链表