C 排序演算法 基類的實現

2021-04-20 02:09:36 字數 3103 閱讀 8766

論壇中經常有人問選擇法、冒泡法排序演算法用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 ...