標籤:blog 資料 for div 代碼 amp log 演算法
冒泡排序演算法是思路最簡單、最直接的排序方法之一。
每遍曆一遍,則將最大(或者最小)的一個數冒泡出來。
預先定義的排序類型。由於只是為了驗證排序方法是否正確,所以此處只是簡單的對10個元素進行排序檢測。如下所示:
#define MAXSIZE 10typedef struct {int r[MAXSIZE+1];int length;}SqList;void swap(SqList *L,int i,int j){ int temp = L->r[i]; L->r[i] = L->r[j]; L->r[j] = temp;}
備忘:本文中的所有排序都是按照升序進行排序的。
第一種:有點像選擇排序的冒泡排序演算法:
這種方法並不是傳統意義上的冒泡法。傳統上的冒泡法是對排序數組中的相鄰的元素進行比較、交換,而這種方法是用每一個元素與剩下的元素進行比較、交換。代碼如下所示:
void BubbleSort0(SqList *L){int i,j;for (i = 0; i < L->length-1; i++){for (j = i+1; j < L->length;j++){if (L->r[i] > L->r[j]){swap(L,i,j);}}}}
第二種:傳統的冒泡排序法:
void BubbleSort1(SqList *L){int i,j;for (i = 0; i < L->length; i++){for (j = 0; j < L->length - i -1; j++){if (L->r[j] > L->r[j+1]){swap(L,j,j+1);}}}}
第三種:改進後的冒泡排序法
我們知道,在冒泡排序演算法中,即使後面的元素序列已經有序了,不需要再進行比較時,冒泡排序演算法依舊會執行到底。那麼能不能將其進行改進,當遇到這樣的情況時,避免多餘的比較操作呢?
可以設定一個標識位,當沒有遇到交換資料時,就說明已經排好序了。那麼演算法即可停止運行。具體代碼如下所示:
void BubbleSort2(SqList *L){int i,j;bool flag = true;for ( i = 0; i < L->length && flag; i++){flag = false;for (j = 0; j < L->length-1-i; j++){if (L->r[j] > L->r[j+1]){swap(L,j,j+1);flag = true;}}}}
參考資料:《大話資料結構》