數據結構-冒泡排序


冒泡排序的方法,就是對於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);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM