冒泡排序的方法,就是对于N个排序元素,比较相邻的元素的大小,如果反序就交换位置,直到没有反序的情况为止。

例如:给定数组{9,1,5,8,3,7,4,6, 2}

排列在数组的方式为:下面的数字为数组中的位置。这里我们假设要排列成从小到大。

9

1

5

8

3

7

4

6

2

0              1                2           3               4              5          6              7            8

第一次循环,求0位置的数值。从【8】位置,开始进行两两比较大小,并交换位置,把最小的数移动到左边,如下图:

image

 

其中每次交换的结果如下:对于第一个位置【0】,我们需要两两比较N-1次(8)。

image

对于位置【1】处,我们需要比较N-2次(7),对于第二个位置的数值的计算过程和上面类似。

image

上面的过程不断的重复,直到确定到第【7】个位置的数值。排列第【0】个位置到【7】个位置的中间结果如下:

image

这样,对于一个N的数组,我们需要比较1+2+….+N-1次,和为N(N-1)/2,所以计算的复杂度为O(N^2). 程序如下:

#include <iostream>

struct MyArray
{
    int value[9];
    int length;
};

void MySwap(MyArray* list, int i, int j)
{
    int temp = list->value[i];
    list->value[i] = list->value[j];
    list->value[j] = temp;
}

void printArray(MyArray* list)
{
    
    for(int i=0;i< list->length;++i)
    {
        std::cout << list->value[i]<<"  ";
    }
    std::cout << std::endl;
}



void MyBubbleSort(MyArray* list)
{
    int length = list->length;

    for(int i=0;i<= length-2; ++i)
    {
        for(int j= length-1; j>=i+1; --j)
        {
            if(list->value[j]<list->value[j-1]){
                MySwap(list,j,j-1);
            }
            //printArray(list);
        }
        //std::cout << std::endl;
        //getchar();
        printArray(list);
    }
}

void main()
{
    MyArray A;
    A.length = 9;
    int X[9] = {9,1,5,8,3,7,4,6,2};
    for(int i=0; i<9;++i)
    {
        A.value[i] = X[i];
    }
    printArray(&A);

    std::cout << std::endl;

    MyBubbleSort(&A);

    //printArray(&A);
}
posted on 2013-03-17 15:35  GreenLight  阅读(3236)  评论(0编辑  收藏  举报