您的位置:首页 > 其它

【算法导论】冒泡排序法

2013-08-01 21:00 218 查看

冒泡排序法

时间复杂度:O(n*n)
基本思想:从数组最后一个元素开始,依次与前一个元素比较,若比前一个元素小,则与之交换位置,然后再与当前前一个元素比较,直到遇到比它大的元素为止。例如:假设数组为:a[5]={3,4,2,5,1};则运算过程为:首先1与5比较,由于1<5,从而交换位置,数组变为a[5]={3,4,2,1,5};然后1与当前前一个元素2比较,一直重复上述操作,经过一次循环后,数组变为a[5]={1,3,4,2,5};第二次循环从倒数第二个元素开始……,总共循环n-1次就可以得到正确结果。总的来说,首先将最小的元素放在数组前面,然后放次最小的元素,依此类推。上述过程的图解为:

34251
34215
34125
31425
13425
注:这里的红色为要进行比较的元素。

具体实现如下:
#include<stdio.h>

void BubbleSort(int* arrayA,int n);

void main()
{
int arrayA[]={2,3,5,6,2,7,1,5};
int n=sizeof(arrayA)/sizeof(int);

BubbleSort(arrayA,n);

for(int i=0;i<n;i++)
printf("%d ",arrayA[i]);
}

void BubbleSort(int* arrayA,int n)
{
for(int i=0;i<n-1;i++)
{
for(int j=n-1;j>i;j--)//j>i即可是因为前面的元素已经排好了
{
int temp=0;
if(arrayA[j]<arrayA[j-1])
{
temp=arrayA[j];
arrayA[j]=arrayA[j-1];
arrayA[j-1]=temp;
}

}
}
}

注意:我是在vs2008上运行的,与vc 6.0有点区别,主要是循环体中的循环变量的作用域,出错体现在循环变量的重复定义上。例如:在vs2008或vs2010上,程序为:

#include<stdio.h>

void main()

{

int i=0;

for(int i=0;i<5;i++)

printf("%d ",i);

}

则在VC 6.0上需改为:

#include<stdio.h>

void main()

{

int i=0;

for(i=0;i<5;i++)

printf("%d ",i);

} 

原文:http://blog.csdn.net/tengweitw/article/details/9707525

作者:nineheadedbird
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: