冒泡排序

来源:互联网 发布:zdm cad辅助设计软件 编辑:程序博客网 时间:2024/06/09 16:15

算法原理

冒泡排序(Bubble Sort)算法的原理如下:
对n个元素进行n-1趟排序,每趟排序中依次比较所有相邻元素,若存在逆序,则对其做交换。故第i趟处理后,元素中第i大(小)的元素必定排在第n-i+1(i)位。

逆序:在一个n级排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个“逆序”。(在降序排序时,前面的数小于后面的数,那么它们就称为一个“逆序”)

PS:在冒泡排序中,每进行一次元素交换,逆序数减一

优化:

(1)由于冒泡排序的特性:第i趟处理后,元素中第i大(小)的元素必定排在第n-i+1(i)位,我们可以在每次处理后,减少下趟所需排序的元素数量,即减1。
(2)上面的处理方式,明显存在做无用功的情况,当某次处理中,并未发现逆序存在时,说明排序已经完成,自然应当停止。

算法分析

时间复杂度

在最坏的情况下,元素为逆序排序,则元素交换次数为:n-1+n-2+n-3+…+1 = n*(n-1)/2,冒泡排序的时间复杂度为 O(n²)(极其低下,不过一般比较小的数据还是愿意用,因为容易打)

Code:

#include <iostream>using namespace std;int input[1000];void swap(int & a,int & b){    int tmp = a;    a = b;    b = tmp;    return ;}bool Bubble(int begin,int end,int *data){    bool flag = false;    for (int n = begin; n < end; n++, flag = false)    {        if (data[n] > data[n+1])            {                swap(data[n],data[n+1]);                flag = true;            }    }    if (!flag) return true;    return false;}void Bubble_Sort(int begin, int end, int * data){    while(!Bubble(begin,end--,data)) ;     //这里以求升序为例}int main(){    int N;    cin>>N;    for (int n = 0; n < N; n++) cin>>input[n];    Bubble_Sort(0,N-1,input);    return 0;}
原创粉丝点击