您的位置:首页 > 其它

(排序)冒泡排序的三种实现

2015-04-25 20:02 183 查看
主要内容:

1、冒泡排序

2、冒泡排序实现1

3、冒泡排序实现2

4、冒泡排序实现3

一、冒泡排序的原理

冒泡排序是简单的一种排序方法,效率低下,复杂度为O(n^2),其具体的算法流程如下:

1、算法需要对数组遍历n-1遍;

2、在每一次遍历中,比较前后相邻元素的大小,如果第一个比第二个大,则交换他们,这样第一次遍历之后数组最后一个值就是最大值;

3、依次重复上面的步骤,就可以得到升序排序的数组。

复杂度分析:

最差时间复杂度(数组从大到小,交换次数):(n-1)+(n-2)+……+1=n*(n-1)/2=O(n^2)

最好时间复杂度(数组从小到大,交换次数):0

二、冒泡排序的实现1

如上述原理:

// naive bubbleSort
void bubbleSort1(int a[],int n){
int tmp;

for(int i=1;i<=n-1;i++){
for(int j=0;j<n-i;j++){
if(a[j]>a[j+1]){
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
}


三、冒泡排序的实现2

设置一个标识,如果在某一趟遍历中没有发生交换,说明排序已经完成,即算法完成。

// set flag to indicate which step to stop
void bubbleSort2(int a[],int n){
int tmp;
bool change=true;
for(int i=1;i<=n-1 && change;i++){
change=false;
for(int j=0;j<n-i;j++){
if(a[j]>a[j+1]){
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
change=true;
}
}
}
}


四、冒泡排序的实现3

如果数组有100个数,仅前面10个无序,后面90个有序,那么第一趟遍历后,最后发生交换的位置必定小于10,记录下这个位置,第二次遍历只需要从数组头部遍历到这个位置即可。

// set flag to indicate what next step should begin from
void bubbleSort3(int a[],int n){
int tmp;
bool change=true;
int flag=n-1;
int k;
for(int i=1;i<=n-1 && change;i++){
change=false;
k=flag;
for(int j=0;j<k;j++){
if(a[j]>a[j+1]){
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
change=true;
flag=j;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: