最近面试,考官问了什么是冒泡排序,时间复杂度为多少。当时我竟然脑子一片空白。
冒泡排序是根据轻者上浮,重者下沉的思想。
分类: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