排序算法-冒泡排序
2018-01-28 10:49
176 查看
冒泡算法是最常见的排序算法之一,冒泡在排序算法中算是比较简单的算法。冒泡名字的由来是因为排序过程是经过相邻元素的比较,大的元素逐渐‘浮’到数列的顶端,就像水泡一样慢慢浮出水面。
经过第一步,数列的最后一个必然是最大的元素。
重复第1步(除了最后一个),每一次都会有一个较大元素被找出,依次有序排列在数列尾端。
这样每次比较次数就会减1。直到每轮比较不再有可交换的元素。
排序完成。
假设排序所需比较次数为C、元素交换次数为S。
最好的情况: 如果待排序的元素是有序的,那么只需要一趟扫描比较即可完成排序。如果元素个数为n,只需n-1次比较,0次元素交换。此时:C=n-1,S=0。则时间复杂度为 O(n)。
最坏的情况: 如果初始元素为倒序状态。若有n个元素,则需要(1+2+...+n-1)= n*(n-1)/2次比较。需要交换元素次数也为n*(n-1)/2次。此时:C=S=n*(n-1)/2。则时间复杂度为O(n2)。度为
综上:冒泡排序的时间复杂度为O(n2)。
空间复杂度
在整个排序过程中,只需一个临时变量用于元素交换,所以空间复杂度为O(1)。
算法稳定性
在排序过程中,相等元素相对先后位置不会发生改变,因此冒泡排序是一种稳定排序。
排序过程:
从数列顶端到尾部依次比较相邻元素,如果第一个比第二个大就交换位置。经过第一步,数列的最后一个必然是最大的元素。
重复第1步(除了最后一个),每一次都会有一个较大元素被找出,依次有序排列在数列尾端。
这样每次比较次数就会减1。直到每轮比较不再有可交换的元素。
排序完成。
算法分析
时间复杂度假设排序所需比较次数为C、元素交换次数为S。
最好的情况: 如果待排序的元素是有序的,那么只需要一趟扫描比较即可完成排序。如果元素个数为n,只需n-1次比较,0次元素交换。此时:C=n-1,S=0。则时间复杂度为 O(n)。
最坏的情况: 如果初始元素为倒序状态。若有n个元素,则需要(1+2+...+n-1)= n*(n-1)/2次比较。需要交换元素次数也为n*(n-1)/2次。此时:C=S=n*(n-1)/2。则时间复杂度为O(n2)。度为
综上:冒泡排序的时间复杂度为O(n2)。
空间复杂度
在整个排序过程中,只需一个临时变量用于元素交换,所以空间复杂度为O(1)。
算法稳定性
在排序过程中,相等元素相对先后位置不会发生改变,因此冒泡排序是一种稳定排序。
算法实现
c语言:#include <stdio.h> int main() { int n; scanf("%d",&n); //元素个数 int num ; int i; for(i = 0; i < n; i++) //依次输入元素 scanf("%d",&num[i]); int j=0,flag = 0; for(i = 0; i < n-1; ++i) //需要n-1次扫描 { flag = 1; //标记数组是否有序 for(j = 0; j < n-1-i; ++j)//每趟需要n-1-1次比较 { int t; //临时变量 if(num[j] > num[j+1]) { flag = 0; t = num[j]; num[j] = num[j+1]; num[j+1] = t; } } if(flag == 1) //如果已经有序,无需再进行扫描 break; } for(i=0;i<n;++i) //输出排过序的数组 printf("%d ",num[i]); return 0; }
相关文章推荐
- 基本排序算法(冒泡排序,选择排序,插入排序)后续[时间测试]
- 排序算法-冒泡排序的三种实现
- 排序算法-冒泡排序
- [031]八大排序算法详解——冒泡排序
- 四种经典排序算法:冒泡排序、选择排序、插入排序和希尔排序
- C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序
- 排序算法之冒泡排序
- 蛮力法在排序算法中的应用(JAVA)--选择排序、冒泡排序
- 6种排序算法及其比较 简单选择排序,堆排序,简单插入排序,希尔排序,冒泡排序,快速排序,归并排序
- 排序算法-冒泡排序
- 经典的排序算法--选择排序与冒泡排序
- 排序算法---冒泡排序
- 排序算法之冒泡排序
- 十二.C语言8种排序算法及其实现 1.希尔排序 2.二分插入法 3.直接插入法 4.带哨兵的直接排序法 5.冒泡排序 6.选择排序 7.快速排序 8.堆排序
- 排序算法之冒泡排序
- 排序算法(1)-冒泡排序
- 排序算法总结(1)——冒泡排序
- 排序算法之冒泡排序
- 算法 排序算法之交换排序--冒泡排序和快速排序
- Java常用排序算法冒泡排序与选择排序总结