您的位置:首页 > 其它

排序算法-冒泡排序

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)。
算法稳定性
  在排序过程中,相等元素相对先后位置不会发生改变,因此冒泡排序是一种稳定排序。

算法实现

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: