1. 程式人生 > >lzq對氣泡排序的理解

lzq對氣泡排序的理解

我們把要排序的數字想象成泡泡們,越大的數字就是越大的泡泡,越小的數字就是越小的泡泡。 

現在呢,我們想讓泡泡們由大到小排列,最上面的最大,最下面的最小,有這樣一個想法:

第一步:讓最大的泡泡浮到最上面,即第一的位置上

第二步:讓第二大的泡泡浮到最大的泡泡的下面,即第二的位置上

…:………………

第N-1步:讓第N-1的泡泡到第N-2的泡泡的下面,即第N-1的位置上。此時,前N-1大的泡泡都在前N-1的位置上了,所以第N大的泡泡一定在第N的位置上,於是泡泡已經排列整齊了~

我們應該怎麼實現這個想法呢?

第一步的實現:我們現在有n個數,假設最大的數在第 i 的位置上。

如果我們的程式每一步

都從最後的位置開始,讓每個位置上的數和前一個位置上的數進行比較,大的換到前面去,這樣,程式執行到 i 的位置時,最大的數會換到第 i-1 的位置上,下一步是第 i-1 位置上的數和第 i-2 位置上的數比較,最大的數會換到第 i-2 的位置上,依次類推,程式執行到第 2 的位置上時,最大的數就換到了第 1 的位置上了~

第二步的實現:同上,只不過我們只需要執行到第 3 的位置就好了,因為這時第二大的數就換到第 2 的位置了。

第k步的實現:同上,我們只需執行到第 k+1 的位置。

第n-1步的實現:同上,執行到第n的位置。

我們要開始最艱難的寫程式碼部分了,哭了~

首先,我們所說的位置呢,當然就用陣列表示啦~

int *a=new int[n+1];

我們要執行n-1步道理一樣的步驟,所以先來一個n-1步的迴圈,i代表的是第i大的數

for(int i=1;i<n;i++)

每一步要幹嘛呢?——從最後的位置開始,讓每個位置上的數和前一個位置上的數進行比較,大的換到前面去,一直到第i+1的位置上,因為這步進行完,第i大的數就到第i的位置上了

for(int j=n;j>i;j--)
    if(a[j]>a[j-1])
        swap(a[j],a[j-1]);      //swap函式在algorithm標頭檔案裡

好了~現在每一步都實現了,讓我們把它們合起來吧~

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,*a = new int [n+1];
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<n;i++)
        for(int j=n;j>i;j--)
            if(a[j]>a[j-1])
                swap(a[j],a[j-1]);
    for(int i=1;i<=n;i++)
        cout<<a[i]<<' ';
    return 0;                 //為了規範我寫個return 0吧,hh~
}
    

寫在最後:好了,該繼續今日的行程了~我本該學樹鏈剖分的啊,哭唧唧