数据结构与算法之排序算法---冒泡排序

来源:互联网 发布:mac缺少图像源地址 编辑:程序博客网 时间:2024/05/17 20:27

数据结构与算法之排序算法—冒泡排序

  • 冒泡排序的基本思想
  • 完整实现代码
  • 复杂度分析

2016年10月18日15:34:24 by:piaxiaohui

冒泡排序的基本思想

冒泡排序:是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

冒泡排序的由来,就有些类似于水中的Bubble,比较轻的Bubble始终在水的底层,而较轻的Bubble在水的上层;较轻的Bubble会向水的上层移动,也就类似于Bubble Weight在比较的过程中,较轻的Bubble会向上冒。

完整代码实现

代码块语法遵循标准markdown代码,例如:

@requires_authorization#include <iostream>using namespace std;//功能函数:实现数组元素的交换功能void swap( int a[], int i , int j){    int temp = a[i];    a[i] = a[j];    a[j] = temp;}//功能函数:实现数组的打印功能void printArray( int a[],int length){    for( int i = 0; i < length; i++){        cout << a[i] << " ";    }    cout << endl;}//核心函数:实现冒泡排序,这里利用一个标志flag来减少比较次数//比如:比较有序的序列 2,1,3,4,5,6,7,8,9,10//在采取了标志位后:// i= 0,比较9次// i= 1,比较8次// i= 2,比较0次,此时没有任何数据交换,说明已经有序void BubbleSort( int a[],int length){    int flag = 1;    for( int i = 0; i < length-1&&flag; i++){          flag = 0;          cout << "第"<<i<<"趟排序后的序列为:"<<endl;          for( int j = length-2; j >= i; j--){              if( a[j] > a[j+1]){                  swap( a,j,j+1);                  flag = 1;              }          }          printArray(a,length);    }}int main(){    int a[10]={1,3,5,7,9,0,2,4,6,8};    int length = 10;    cout<<"数组排序前为:"<<endl;    printArray(a,length);    BubbleSort(a,length);    cout <<"数组排序后为:"<<endl;    printArray(a,length);    return 0;}

运行结果:
这里写图片描述

时间复杂度分析

(1) 最好的情况,也就是要排序的数组有序,没有数据交换
a[10]={1,2,3,4,5,6,7,8,9,10};
需要比较的次数为:n-1次 也就是i = 0时,需要比较9次
(2) 最坏的情况,也就是要排序的数组逆序,每一次比较都要逆序
a[10]={10,9,8,7,6,5,4,3,2,1};
i = 0 时,要比较的次数为9次
i = 1 时, 要比较的次数为8次
……
(n-1)+(n-2)+(n-3)+…+3+2+1 = n(n-1)/2;
因此时间复杂度为:O(n2);

0 0