論壇中經常有人問選擇法、冒泡法排序演算法用c# 怎麼實現,正好我手頭上有這方面的**,乾脆拿出來跟大家分享一下。其實**已經寫了很久了,只是平時工作比較忙,沒時間整理。現在失業了,每天呆在家裡實在無聊,就抽空把這部分**整理出來。好了,廢話少說,進入正題吧。
排序演算法,首先應該考慮的是通用性,不管是陣列,還是list 都應該支援,那肯定要用到泛型了,那麼是不是應該用形如下面的實現呢?
public
class sorter
public
void sort(listlist) }
這是c++ 的風格,不是c# 的風格。那麼c# 的風格是什麼?當然是介面了。那麼陣列和list 有共同的介面嗎?當然有了,那就是ilist 介面。好了,型別的形式已經確定了。
好了,那下一步泛型應該採用什麼形式呢?
形式(1):
public
class sorter }
形式(2):
public
class sorter }
形式(1)的呼叫:
形式(2)的呼叫:
int array = ;
sorter.sort(array); //注意這裡可以不用加資料型別,執行的時候會自動識別引數的型別
毫無疑問,你肯定會選擇形式(2)了。好了,泛型的形式也確定了。
下一步該考慮sorter 類的設計了,是應該把sorter 設計成工具類嗎?
這也太不符合物件導向的概念了,物件導向的精髓是什麼?繼承、封裝與多型。沒錯,這裡我們繼承和多型,將sorter 設計成虛擬基類,而具體的排序過程留到子類中實現。整個類庫的形式應該如下:
///
/// 虛擬基類
///
public
abstract
class sorter
///
/// 冒泡法
///
public
class bubblesorter : sorter }
///
/// 選擇法
///
public
class selectionsort : sorter }
////其他排序方法
//
好了,既然是排序,當然要涉及到比較的問題了,c#中提供兩種比較的方法:icomparable和icomparer介面,icomparable介面有唯一的乙個方法:
int compareto(t other);
icomparer 介面也只有乙個方法:
int compare(t x, t y);
兩者引數的個數不一樣,怎麼把他們統一起來?當然是用委託啦。先定義乙個委託:
public
delegate
int comparedelegate(t left, t right);
然後稍微改變一下sorter 類的**:
///
/// 虛擬基類
///
public
abstract
class sorter
; sort(list, compare);
} public
void sort(ilistlist, icomparercomparer) }
最後,關於公升序排列和降序排列的問題。你可能會認為,這還不簡單,只要稍微改變icomparable型別的comparetto方法就可以了。那麼對於int、double這樣的內建資料型別或者第三方提供的型別,你無法改變其源**,那怎麼處理?當然辦法還是有的,自定義乙個icomparer類。那要對同一型別,要求既可以進行公升序排列又可以進行降序排列怎麼辦?當然辦法還是有的,定義兩個icomparer類,分別用於公升序和降序排列。但是這些辦法都不夠靈活。這裡,我們的sorter基類將公升序排列和降序排列考慮進來,得到了sorter類的最終版本:
using system;
using system.collections.generic;
using system.text;
namespace cyb.datastruct.sorting
public
delegate
int comparedelegate(t left, t right);
///
/// 作者 : cyb
/// 發表時間 : 2008-9-8
/// qq : 13101908
/// e-mail : [email protected]
///
public
abstract
class sorter
if (compare == null ) }
public
void sort(ilistlist, order order) where t : icomparable
; }
else ;
} sort(list, compare);
} public
void sort(ilistlist) where t : icomparable
public
void sort(ilistlist, icomparercomparer, order order)
; }
else ;
} sort(list, compare);
} public
void sort(ilistlist, icomparercomparer)
///
/// 交換集合中的兩個元素,子類中會用到
///
public
static
void swaplistitem(ilistlist, int firstindex, int secondindex) }
} 這裡要注意一點,icomparable和icomparer的compareto方法是假定為公升序排列編寫的,否則order.asc和order.desc就沒有意義了。
磨刀不誤砍柴功,基類設計好了,子類的實現就比較簡單了。子類的實現即排序的具體細節將會在近期整理出來。
C 虛基類的實現機制
在 深度探索c 物件模型 裡,有乙個問題,也是去公司面試的時候那些技術人員常問的問題 在c 中,obj是乙個類的物件,p是指向obj的指標,該類裡面有個資料成員mem,請問obj.mem和p mem在實現和效率上有什麼不同。答案是 只有一種情況下才有重大差異,該情況必須滿足以下3個條件 1 obj ...
C 虛基類的實現機制
在 深度探索c 物件模型 裡,有乙個問題,也是去公司面試的時候那些技術人員常問的問題 在c 中,obj是乙個類的物件,p是指向obj的指標,該類裡面有個資料成員mem,請問obj.mem和p mem在實現和效率上有什麼不同。答案是 只有一種情況下才有重大差異,該情況必須滿足以下3個條件 1 obj ...
C 虛基類的實現機制
在 深度探索c 物件模型 裡,有乙個問題,也是去公司面試的時候那些技術人員常問的問題 在c 中,obj是乙個類的物件,p是指向obj的指標,該類裡面有個資料成員mem,請問obj.mem和p mem在實現和效率上有什麼不同。答案是 只有一種情況下才有重大差異,該情況必須滿足以下3個條件 1 obj ...