冒泡排序(C++)

最近面试,考官问了什么是冒泡排序,时间复杂度为多少。当时我竟然脑子一片空白。

冒泡排序是根据轻者上浮,重者下沉的思想。

分类:1*上浮排序           2*下沉排序

我来说一下什么事下沉排序:

对于一列数组,比如整形数组。下沉排序就是从头到尾进行排序,每一趟排序,需要从头开始,依次比较两个整数,如果前者>后者,则把两者进行交换,然后比较第2,3个元素,.....直到末尾两个元素比较完成。经过一趟排序,最重的元素“下沉”到最末尾。然后开始进行第二趟比较和排序,.....每一趟排序如果只发生了比较操作,而没有发生交换操作,我们确定该数组已经排序成功不需要下一趟排序。不然我们将至多进行n-1趟排序。

冒泡排序的时间复杂度:最好O(n),最坏O(n^2),一般O(n^2)。

举例如下:

//

//  main.cpp

//  bubbleSort

//

//  Created by 胡士伟 on 16/6/8.

//  Copyright © 2016胡士伟. All rights reserved.

//


#include <iostream>

using namespace std;

void bubbleSort(int [],int);//下沉冒泡排序

void swap(int *,int *);   //两个整形数据进行交换



template <class T>


int getArrayLen(T& array)  //获取数组长度


{//使用模板定义一个函数getArrayLen,该函数将返回数组array的长度

    

    return (sizeof(array) /sizeof(array[0]));

    

}



int main(int argc,const char * argv[]) {

    int data[10]={23,45,34,56,19,78,9,90,10,78};

    //int j=sizeof(data) / sizeof(data[0])-1;

    int j=getArrayLen(data);

    cout<<"数组长度为:"<<j<<endl;

    cout<<"排序前的数组为:"<<endl;

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

        cout<<data[i]<<" ";

    printf("\n");

    bubbleSort(data, j);

    cout<<"排序后的数组为:"<<endl;

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

        printf("%i ",data[i]);

    cout<<endl;

    return 0;

}


void bubbleSort(int data[],int n)

{

    int flag; //用来标志在一趟下沉冒泡排序过程中是否发生数据交换,如果是为1,否则为0;如果在一趟排序中没有发生数据交换,则表明已经排序成功

    int i=1,j;

    do

    {

        flag=0;

        for(j=0;j+1<n;j++)

        {

            if(data[j]>data[j+1])

            {

                swap(data[j],data[j+1]);

                flag=1;//发生了数据交换

            }

        }

        i++;

    }while(i<n && flag == 1);

    

}


void swap(int *a,int *b) //两个数据进行交换,需要一个中间变量

{

    int temp;

    temp=*a;

    *a=*b;

    *b=temp;

}


运行结果如下:

数组长度为:10

排序前的数组为:

23 45 34 56 19 78 9 90 10 78 

排序后的数组为:

9 10 19 23 34 45 56 78 78 90 

Program ended with exit code: 0



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值