码迷,mamicode.com
首页 > 编程语言 > 详细

冒泡排序

时间:2016-08-29 22:24:16      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

交换排序是指在排序过程中,通过待排序记录序列中元素间关键字的比较,将数据元素进行交换来达到排序目的的方法,主要包括冒泡排序和快速排序。

冒泡排序的基本思想是对所有相邻记录的关键字进行比较,如果a[j]>a[j+1]则将其交换,最终达到有序化。其处理步骤如下:

(1)首先将整个待排序的记录分为有序区和无序区,初始状态有序区为空无序区则为整个待排序的记录。

(2)对无序区从前往后依次将相邻记录的关键字进行比较,若逆序则进行交换,从而使得较大的数据元素右移,这样最终形成有序序列。

通过上面的步骤可以发现,每一次冒泡排序都将无序区中最大的数据元素移到有序区的最右边。并且,对于含n个数据元素的数据序列,最多需要经过n-1趟冒泡排序。

void BubbleSort(int* a,int length)
{
    if (a == NULL || length <= 0)
        return;
    int i, j,temp;
    for (i = length - 1; i > 0; i--){
        for (j = 0; j <i; j++){
            if (a[j]>a[j + 1]){
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
}

//如果一次循环中,没有进行数据交换,那么就说明序列已经有序。
void BetterBubbleSort(int* a, int length){
    if (a == NULL || length <= 0)
        return;
    int i, j, temp;
    bool isChanged=false;
    for (i = length - 1; i > 0; i--){
        isChanged = false;
        for (j = 0; j <i; j++){
            if (a[j]>a[j + 1]){
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
                isChanged = true;
            }
        }
        if (isChanged == false)
            break;
    }
}

//更好的冒泡排序,在一次冒泡排序中最后进行交换的位置为j,故我声明了一个last变量记录j,last<=i
//然后进行循环时last~i之间的数据元素将为有序,last左边的数据将是无序区。
void BestBubbleSort(int* a, int length){
    if (a == NULL || length <= 0)
        return;
    int i, j, temp,last=0,m;
    bool isChanged;
    last = length - 1;
    for (i = length - 1; i>0; i--){
        isChanged = false;
        m = last;
        for (j = 0; j <m; j++)
        {
            if (a[j]>a[j + 1])
            {
                temp = a[j];
                a[j] = a[j + 1];
                a[j+1] = temp;
                isChanged = true;
                last = j;
            }
        }
        if (isChanged == false)
            break;
    }
}

 冒泡排序是一种稳定的排序方法,因为只有在大于后一个数的情况下才进行交换。冒泡排序最好情况比较次数为n-1,移动次数仅为0,此时数据元素本身就是有序序列。最坏情况下比较次数为n*(n-1)/2,移动次数为3n(n-1)/2,平均时间复杂度为O(n^2)。

冒泡排序

标签:

原文地址:http://www.cnblogs.com/fangyz/p/5818538.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!