lzq對氣泡排序的理解
阿新 • • 發佈:2018-12-09
我們把要排序的數字想象成泡泡們,越大的數字就是越大的泡泡,越小的數字就是越小的泡泡。
現在呢,我們想讓泡泡們由大到小排列,最上面的最大,最下面的最小,有這樣一個想法:
第一步:讓最大的泡泡浮到最上面,即第一的位置上
第二步:讓第二大的泡泡浮到最大的泡泡的下面,即第二的位置上
…:………………
第N-1步:讓第N-1的泡泡到第N-2的泡泡的下面,即第N-1的位置上。此時,前N-1大的泡泡都在前N-1的位置上了,所以第N大的泡泡一定在第N的位置上,於是泡泡已經排列整齊了~
我們應該怎麼實現這個想法呢?
第一步的實現:我們現在有n個數,假設最大的數在第 i 的位置上。
如果我們的程式每一步
第二步的實現:同上,只不過我們只需要執行到第 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~
}
寫在最後:好了,該繼續今日的行程了~我本該學樹鏈剖分的啊,哭唧唧