在閱讀此博文前,請先閱讀我的博文「c#排序——基類設計 「,以了解基類的結構。
關於冒泡法的概念,網上有一大堆的介紹,你可以到baidu或goole去搜尋,這裡不作詳細解釋,這遍博文的主要目標是如用c#實現氣泡排序演算法。這裡只簡要的介紹一下氣泡排序的過程:
假設有乙個ilist型的集合list(集合的元素為list[0]到list[n-1], n = list.count),那麼第一次遍歷,從索引為0的元素開始,到索引為n-1的元素結束.在list的元素間移到時,每次都比較當前元素(假設索引號為i)與相鄰元素(這種情況為下一元素i+1)的大小,如果當前元素的值小於(對於降序排列為大於)相鄰元素的值,則將當前元素與其相鄰元素互換:
當i=0時,比較list[0]與list[1], 如果list[0] < list[1], 則將list[0]和list[1]互換。
當i=1時,比較list[1]與list[2], 如果list[1] < list[2], 則將list[1]和list[2]互換。
...當i=n-2時,比較list[n-2]與list[n-1],如果list[n-2] < list[n-1],則將list[n-2]與list[n-1]互換。
顯然經過第一輪遍歷後,list[n-1]為list集合中值最大(對於降序排列為最小)的元素。好了,list[n-1]的位置已經排好了,下一輪遍歷從list[0]開始,到list[n-2]結束。即:
第1輪遍歷,從list[0]開始,到list[n-1]結束,遍歷結束後,list[n-1]的位置確定了。
第2輪遍歷,從list[0]開始,到list[n-2]結束,遍歷結束後,list[n-2]位置確定了。
...第n-1輪遍歷,從list[0]開始,到list[1]結束,遍歷結束後,list[1]位置確定了。
第n輪遍歷,就剩下list[0]乙個元素了,其位置當然也就確定了,因此只根本就沒必要第n輪遍歷了,只需要n-1次遍歷即可。
好了,廢話少說,將上面的轉變成程式,得到我們的冒泡法排序器bubblesort的**:
public
class bubblesorter : sorter }
} } }
其中swaplistitem是其類sorter的靜態方法,用於換list中的兩個元素。
現在可以用**測試排序是否正確:
int array = ;
sorter sorter = new bubblesorter();
sorter.sort(array);
foreach ( int i in array)
怎麼樣?沒問題吧。是不是很簡單?現在還不高興得太早,程式雖然沒問題,但是效率不太高。如果我們在排序過程中發現list已經排好序了,就沒必要傻傻地地繼續掃瞄了。怎麼判斷list有沒有排序?很簡單,如果在一輪遍歷過程中,沒有發生元素交換,那麼list就是已經排好序了。好了,現在得到bubblesorter的最終版本:
using system;
using system.collections.generic;
using system.text;
namespace cyb.datastruct.sorting }
} }
} }
冒泡法排序c語言程式 演算法 冒泡法排序
對於乙個一維的陣列 列表 每個元素都和它旁邊的元素作比較,順序不對就交換位置。第一次處理全部n個元素,最大值將冒泡到陣列末尾位置。第二次處理全部n 1個元素,第三次處理全部n 2個元素。以此類推,每次都將最大值元素放到最右邊的位置。冒泡法的優點是任何時候陣列完全排好序就可以提前退出。來看動態演示 下...
演算法 氣泡排序法
氣泡排序就是把小的元素往前調或者把大的元素往後調 c語言 include define size 8 void bubble sort int a,int n void bubble sort int a,int n int main int i bubble sort number,size fo...
冒泡法排序演算法
演算法筆記 再回顧冒泡法排序 冒泡法是我們學習程式設計接觸到的第乙個排序演算法,簡單而形象,整個比對過程跟泉水冒泡十分形似。冒泡法排序首先拿第乙個元素與相鄰元素進行比較,如果它比較大,就相互交換,這樣第一輪遍歷下來,最大的值就確定了,第n輪也是如此,都是從第乙個開始,一直比較到倒數第n個,這樣最大的...