




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
}}}}基于.NET的常用排序算法以及運行時間比較對集合進行排序是一種演示任務并行的方法。我們在這里對一個整數集合進行排序,當然,排序會存在不同的方法,在這里我們將使用三種常見的排序方法,以便找到最快的一種排序方法(當然這里的例子都是以升序方式排序的)。我們要比較的排序方法分別為:冒泡排序、插入排序和支點排序。當然在本例中,潛在的依賴是整數集合,他由不同的方法對集合同時進行排序。這是一個問題,因為整數集合正在被排序到適合的位置。有不同的技術可以解決依賴關系。一種解決方案是復制共享數據,并且給每個任務提供一個私有復制,這種方法是這里選擇的方法;每個任務(排序算法)得到原始整數集合的復制作為參數。冒泡排序(BubbleSort )冒泡排序是一個常用的排序算法,不過這并不意味著它是一種最快的排序算法。實際上他有可能是最慢的排序方法之一。與其他排序方法比較,你就會發現冒泡排序是多么的慢。所以說,流行并不等于質量!冒泡排序執行的是二進制比較。他通常從集合的起點開始,并且比較最前面的兩個元素。如果第二個元素小于第一個元素,則交換元素的位置。接著對第二個和第三個元素執行相同的比較和交換操作, 等等,知道集合的結尾。排序接著從起點重復,直到該集合被充分排序。下面是示例代碼:{<Code1>#C#.NETCode#}publicstaticvoidBubbleSort(List<int>sortedList){inttemp,count=sortedList.Count;for(inti=0;i<count;++i){for(intj=0;j+1<count;++j){If(sortedList[j]>sortedList[j+1]){temp=sortedList[j];sortedList[j]=sortedList[j+1];sortedList[j+1]=temp;}#VB.NETCode#PublicSharedSubBubbleSort(ByValsortedListAsInteger())DimtempAsInteger,countAsInteger=sortedList.CountForIAsInteger=0Tocount -1Step1ForjAsInteger=0Tocount -2Step1IfsortedList(j)>sortedList(j+1)Thentemp=sortedList(j)sortedList(j)=sortedList(j+1)sortedList(j+1)=tempEndIfNextjNextiEndSub插入排序(InsertionSort)插入排序會迭代集合多次。每次迭代都將所選項目放到排序順序中的正確位置。例如,初始迭代掃描集合,并將第一個元素放到排序序列的正確位置。第二次迭代再次掃描列表并將第二個元素放到正確位置。迭代繼續,知道列表中的每個元素都被正確的定位。插入排序可以使用兩種列表:未排序列表(輸入)和排序列表(輸出);不過,這個例子只使用一個列表,執行排序到位。通過使用插入、重新配置和刪除操作,排序重新配置每個元素。下面是具體的示例代碼:{<Code2>#C#.NETCode#}publicstaticvoidInsertionSort(List<int>sortedList,CancellationTokentoken){intcurrentLocation,currentValue,insertionLocation,count=sortedList.Count;sortedList.Insert(0,0);for(intlocation=1;location<count+1;++location){currentLocation=location;insertionLocation=location —1;currentValue=sortedList[currentLcation];while(sortedList[insertionLocation]>currentValue){sortedList[currentLocation]=sortedList[insertionLocation];--currentLocation;--insertionLocation;}sortedList[currentLocation]=currentValue;}sortedList.Remove(0);}#VB.NETCode#PublicSharedSubInsertionSort(ByValsortedListAsInteger(),_ByValtokenAsCancellationToken)DimcountAsInteger=sortedList.CountDimcurrentLocation,currentValue,insertionLocationAsIntegersortedList.Insert(0,0)ForlocationAsInteger=1TocountStep1currentLocation=locationinsertionLocation=location -1currentValue=sortedList(currentLocation)DoWhilesortedList(currrentLocation)=sortedList(insertionLocation)sortedList(currentLocation)=sortedList(insertionLocation)currentLocation=currentLocation -1insertionLocation=insertionLocation-1LoopsortedList(currentLocation)=currentValueNextlocationsortedList.Remove(0)EndSub支點排序(PivotSort)支點排序就很有趣!支點排序就是俗稱的快速排序(QuickSort)。該算法首先選擇一個支點值,將集合分為兩個集合。第一個集合包含小于支點值得元素,第二個集合包含大于支點值的元素。然后使用新的支點值在兩個子集合中執行支點排序。繼續遞歸劃分和排序集合,直到每個子集合包含一個元素。最后組裝排序的子集合來新建排序列表。因為本示例以升序排序,所以總是將較小的值放在左子集合,較大的放在右子集合。下面是示例代碼:{<Code3>#C#.NETCode#}publicstaticvoidPivotSort(List<int>integerList,intbegin,intlast,intpivot){if(begin<last){pivot=integerList[last];intlocation=begin,bound=last;while(location<bound){if(integerList[location]<pivot){
++location;}else{integerList[bound]=integerList[location];integerList[location]=integerList[bound-1];--bound;}}integerList[bound]=pivot;PivotSort(integerList,begin,bound -1,pivot);PivotSort(integerList,bound+1,last,pivot);}}#VB.NETCode#PublicSharedSubPivotSort(ByValintegerListAsInteger(),_ByValbeginAsInteger,ByVallastAsInteger,_ByValpivotAsInteger)Ifbegin<lastThenpivot=integerList(last)DimlocationAsInteger=begin,boundAsInteger=lastDoWhilelocation<boundIfintegerList(location)<pivotThenlocation=location+1ElseintegerList(bound)=integerList(location)integerList(location)=integerList(bound-1)bound=bound-1EndIfLoopintegerList(bound)=pivotPivotSort(integerList,begin,bound -1,pivot)PivotSort(integerList,bound -1,last,pivot)EndIfEndSubFramework使用Barrier類對排序算法運行時間比較Framework為了使賽馬公平,所有的馬匹需要在同一時間開始起跑。賽馬使用了首發門;同理Microsoft.NET提供了Barrier類。Barrier類位于System.Threading名空間。他是在提供了Barrier類。Barrier類位于System.Threading名空間。他是在Microsoft.NETFramework4中引入的。你可以使用Barrier類新建邏輯門或應用程序的各個階段。初始化Barrier時,可以設置元素的最大數量。直到達到最大數量,給Barrier添加元素會阻擋當前任務當當Barrier 達到容量時會 泄露”此時,等待任務執行。所以當Barrier滿時(所有馬匹都在門口),它便釋當當Barrier 達到容量時會 泄露”此時,等待任務執行。所以當Barrier滿時(所有馬匹都在門口),它便釋放所有任務(比賽開始)下圖說明了一個容量等于 3的BarrierT1BarrierBarrier泄露Barrier也可以把Barrier想成一個桶。當桶滿了的時候,它會翻倒在地。當然,此時桶里的所有的東西都會被灑岀來了F面是Barrier類的一些有用的實例方法:T1BarrierBarrier泄露Barrier也可以把Barrier想成一個桶。當桶滿了的時候,它會翻倒在地。當然,此時桶里的所有的東西都會被灑岀來了F面是Barrier類的一些有用的實例方法:1、 1、 Barrier constrauctor(intparticipantCount)新建一個Barrier實例并設置Barrier實例容量,對應VB.NET定義為FunctionConstrauctor(ByValparticipantCountAsInteger)AsBarrier2、voidSignalAndWait() 發岀信號,任務已達到Barrier ,對應的VB.NET定義為SubSignalAndWait()3、longAddParticoants(intparticipantCount) 增加Barrier 的容量,對應的VB.NET定義為FunctionAddParticoants(ByValparticipantCountAsInteger)AsLong4、voidRemovePaticipants(intparticipantCount) 減少Barrier 的容量,對應的VB.NET定義為SubRemovePaticipants(ByValparticipantCountAsInteger)這個排序例子使用一個 Barrier 來標記排序階段的開始。Barrier的最大值設置為3(冒泡、插入和支點排序)使用Barrier 可以保證三種排序程序同時開始,從而保證了比賽的公平性。每種算法在一個單獨的代碼域開始。每個區域都遵循下面這個相同的通用模式。1、復制列表運行這段代碼,將得到一個類似下圖的結果,顯示對 運行這段代碼,將得到一個類似下圖的結果,顯示對 10000 個整數排序的以毫秒計數的持續時間結果。最終獲2、新建排序算法任務。3、任務:向Barrier發信號。4、任務:執行排序。5、啟動任務。下面是插入排序區域,是三個排序區域的其中一個。下面代碼需要導入System.Threading 和System.Threading.Tasks 命名空間,并且需要使用4.0以及更高版本的Microsoft.NETFramework 。下面是示例代碼:{<Code4>#C#.NETCode#}//InsertionSortRegionList<int>insertionList=integerList.ToList();TasktaskInsertionSort=newTask(()=>{sortBarrier.SignalAndWait();using(newSortResults( “InsertionSort”)){SortAlgorithms.InsertionSort(insertionList);}});taskInsertionSort.Start();#VB.NETCode#,InsertionSortRegionDiminsertionListAsInteger()=integerList.ToList()DimtaskInsertionSortAsTask=NewTask(Function()sortBarrier.SignalAndWait()UsingNewSortResults(“InsertionSort”)){SortAlqorithms.InsertionSort(insertionList)}}EndFunction)taskInsertionSort.Start()還需要一些代碼來顯示每種排序算法的持續時間,以便找到哪種排序最快。這段代碼等待排序任務完成,然后迭代并顯示結果:{<Code5>#C#.NETCode#}Task.WaitAll(newTask[]{taskBubbleSort,taskInsertionSort,taskPivotSort});foreach(stringresultinSortResults.results){Console.WriteLine(result);}#VB.NETCode#Task.WaitAll(NewTask(){taskBubbleSort,taskInsertionSort,taskPivotSort})ForEachresultAsStringInSortResults.resultsConsole.WriteLine(result)Next勝者是----支點排序!這場比賽甚至還沒有結束。file:///C:/Users/DickSmith/AppData/Local/Temp.?PivotSar*t:161msIn#佯MionSort=39,509nsBubbleSort=167,389ms代碼在哪里計算持續時間呢?首先,一個在System.Diagnosties 命名空間定義的Stopwatch 類被用來跟蹤每個算法的持續時間。在本示例程序中,SortResults 是類Stopwatch 類的一個封裝,計算一個排序算法的持續時間以下是對SortResults類的一般描述:1、在SortResults類中,新建一個Stopwatch 類的實例作為成員域。2、 構造函數調用Stopwatch市里的Start方法,并設置算法的名稱。3、Dispose 方法調用Stopwatch的Stop方法。結果接著被實例化并添加到結果集合。該結果集合隨后
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年工程管理課程考核試題及答案
- 2025年工程項目風險管理考試題及答案
- 壓力初一滿分作文9篇范文
- 國慶假期作文400字(15篇)
- 商業合作伙伴保密協議細節規定
- 在線會議服務合同書
- 《人類基因與遺傳信息解讀:高中生物教學教案》
- 秋天的懷念情感探究與寫作技巧教案
- 初中文言文誦讀課教案設計
- 語文文學《紅樓夢主題作品教學大綱》
- 2025設備租賃合同版本范文
- 2025年全國高考數學真題全國2卷
- 2025年浙江杭州錢塘區和達能源有限公司招聘筆試沖刺題(帶答案解析)
- 轉讓釣場合同協議書
- 2025年四川省成都市初中學業水平考試生物試題(無答案)
- 醫院感染教學課件
- 民航危險品運輸典型案例55課件
- 倉庫管理制度及流程
- 四川省綿陽市名校聯盟2025屆八年級物理第二學期期末復習檢測試題含解析
- 《全球教育資源庫》課件
- 2025-2030中國烘焙食品行業市場發展分析與發展趨勢及投資風險研究報告
評論
0/150
提交評論