zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

排序 实现 三种 冒泡排序
2023-09-14 08:59:06 时间

主要内容:

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;
            }
        }
    }
}