[【筆記】氣泡排序法
/* * 內容: 氣泡排序法 * 作者: wolves_liu * 日期: 2018.3.21 * 參考: 大話資料結構 */ // 線性表順序儲存結構 #define Max 20 typedef struct { int r[Max+1]; int length; }Sqlist;
// 交換L->r[i]和L->r[j]的值 void swap(Sqlist *L, int i, int j) { int temp = 0; temp = L->r[i]; L->r[i] = L->r[j]; L->r[j] = temp; }
// (偽)冒泡演算法1 void BubbleSort0(Sqlist *L) //小的數放上面去 { int i, j; for(i=1; i<L->length; i++) // 用第i個元素跟它後面的每一個元素都進行比較 { for(j=i+1; j<=L->length; j++) { if(L->r[i] > L->r[j]) { swap(L, i, j); // 交換L->r[i]和L->r[j]的值 } } } }
// (正宗)冒泡演算法2 void BubbleSort1(Sqlist *L) { int i, j; for(i=1; i<L->length; i++) { for(j=L->length-1; j>=i; j--) // j從倒數第二個開始 { if(L->r[j] > L->r[j+1]) // 前者 > 後者 就交換 { swap(L, j, j+1); } } } }
// (對冒泡演算法進一步優化)冒泡演算法3 void BubbleSort3(Sqlist *L) { int i = 0, j = 0; bool flag = 1; // 用flag作標記 for(i=1; i<L->length && flag; i++) // 如果flag為真,就執行迴圈 { flag = 0; for(j=L->length-1; j>=i; j--) { if(L->r[j] > L->r[j+1]) { swap(L, j, j+1); flag = 1; // 如果執行了交換函式,讓flag為真,就可以繼續執行迴圈; // 如果沒有執行交換函式,則flag為假,就不用執行外迴圈了。 } } } }
// 自己寫的,r[0]-r[4] void swap(int &a, int &b) { int temp = a; a = b; b = temp; }
int main(int argc, _TCHAR* argv[]) { int r[5] = {8, 6, 36, 2, 0};
// 對應(偽)冒泡演算法1 for(int i=0; i<4; i++) { for(int j=i+1; j<5; j++) { if(r[i] > r[j]) { swap(r[i], r[j]); } } } // 對應(正宗)冒泡演算法2 for(int i=0; i<4; i++) { for(int j=3; j>=i; j--) //j是倒數第二開始 { if(r[j] > r[j+1]) { swap(r[j], r[j+1]); } } }
for(int i=0; i<5; i++) { cout<<(r[i])<<endl; } return 0; }