排序算法C#实现之快速排序详解
生活随笔
收集整理的這篇文章主要介紹了
排序算法C#实现之快速排序详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【任務目標】
將一組大規模無序數組變為有序
【快速排序原理】
將上述步驟轉換為程序語言時,有些地方要注意:
【快速排序原理概括】
通過不斷比較將小數前移大數后移來將隨機選取的基準數放置在其在有序數組中應該在的位置,通過遞歸調用將不斷地把隨機選取的基準數放置在其所在數組有序時應該在的位置。
【代碼實現】
using System;namespace Sort {class Program{static void Main(string[] args){int[] A = new int[30];Random ra = new Random();for (int i = 0; i < 30; i++){A[i] = ra.Next(200);}Program ps = new Program();ps.QuickSort(A,0,A.Length-1);Console.WriteLine("排序結果:");foreach (int a in A){Console.Write(a + " ");}bool isSorted = true;for (int i = 0; i < A.Length - 1; i++){if (A[i] > A[i + 1])isSorted = false;}Console.Write(isSorted);Console.ReadKey();}public void QuickSort(int[] A,int lo,int hi){if (lo > hi)//遞歸退出條件{return;}int i = lo;int j = hi;int temp = A[i];//取得基準數,空出一個位置while (i<j)//當i=j時推出,表示temp左邊的數都比temp小,右邊的數都比temp大{while (i<j&&temp<=A[j])//從后往前找比temp小的數,將比temp小的數往前移{j--;}A[i] = A[j];//將比基準數小的數放在空出的位置,j的位置又空了出來while (i<j&&temp>=A[i])//從前往后找比temp大的數,將比temp大的數往后移{i++;}A[j] = A[i];//將比基準數大的數放在hi空出來的位置,如此,i所在的位置又空了出來}A[i] = temp;QuickSort(A,lo,i-1);//對lo到i-1之間的數再使用快速排序,每次快速排序的結果是找到了基準數應該在的位置//其左邊的數都<=它,右邊的數都>=它,它此時在數組中的位置就是排序好時其應該在的位置。QuickSort(A,i+1,hi);//對i+1到hi之間的數再使用快速排序}} }【實現結果】
【快速排序改進】
1.雖然文中說基準數可以隨機選取,但在代碼時對遞歸調用時的每個無序數組選取的都是其第一個元素。你當然也可以選擇中間的元素,temp=A[(lo+hi)/2]即可。面對不同的數據,具體怎么來選擇這個隨機基準數沒有特定的方法。一般就取第一個元素或中間元素即可。
隨機基準數選取的不好,可能出現這樣的結果(以選取第一個元素為例):比較了一圈發現,基準數只向后移動了兩三位就到了其應在位置。那么其左邊的無序數組很小,右邊的無序數組很大。在為右邊的無序數組選擇的基準數找位置時,要找很多次。這就增加了計算時間。最好是每次為基準數找好位置時,其位置為當前數組的最中間,那樣左右兩邊的無序數組大小相同。
2.不斷遞歸調用時,當前的無序數組規模是在不斷減小的,當規模減小到一定程度可以用插入排序代替快速排序。插入排序在小規模數據中排序速度更快。
?
?
?
總結
以上是生活随笔為你收集整理的排序算法C#实现之快速排序详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前沿篇:西门子博图指令(指令含义)(工控
- 下一篇: C# 操作word 指定书签位置插入图片