排序算法C#实现之快速排序详解
【任務(wù)目標(biāo)】
將一組大規(guī)模無序數(shù)組變?yōu)橛行?/p>
【快速排序原理】
將上述步驟轉(zhuǎn)換為程序語言時(shí),有些地方要注意:
【快速排序原理概括】
通過不斷比較將小數(shù)前移大數(shù)后移來將隨機(jī)選取的基準(zhǔn)數(shù)放置在其在有序數(shù)組中應(yīng)該在的位置,通過遞歸調(diào)用將不斷地把隨機(jī)選取的基準(zhǔn)數(shù)放置在其所在數(shù)組有序時(shí)應(yīng)該在的位置。
【代碼實(shí)現(xiàn)】
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("排序結(jié)果:");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];//取得基準(zhǔn)數(shù),空出一個(gè)位置while (i<j)//當(dāng)i=j時(shí)推出,表示temp左邊的數(shù)都比temp小,右邊的數(shù)都比temp大{while (i<j&&temp<=A[j])//從后往前找比temp小的數(shù),將比temp小的數(shù)往前移{j--;}A[i] = A[j];//將比基準(zhǔn)數(shù)小的數(shù)放在空出的位置,j的位置又空了出來while (i<j&&temp>=A[i])//從前往后找比temp大的數(shù),將比temp大的數(shù)往后移{i++;}A[j] = A[i];//將比基準(zhǔn)數(shù)大的數(shù)放在hi空出來的位置,如此,i所在的位置又空了出來}A[i] = temp;QuickSort(A,lo,i-1);//對lo到i-1之間的數(shù)再使用快速排序,每次快速排序的結(jié)果是找到了基準(zhǔn)數(shù)應(yīng)該在的位置//其左邊的數(shù)都<=它,右邊的數(shù)都>=它,它此時(shí)在數(shù)組中的位置就是排序好時(shí)其應(yīng)該在的位置。QuickSort(A,i+1,hi);//對i+1到hi之間的數(shù)再使用快速排序}} }【實(shí)現(xiàn)結(jié)果】
【快速排序改進(jìn)】
1.雖然文中說基準(zhǔn)數(shù)可以隨機(jī)選取,但在代碼時(shí)對遞歸調(diào)用時(shí)的每個(gè)無序數(shù)組選取的都是其第一個(gè)元素。你當(dāng)然也可以選擇中間的元素,temp=A[(lo+hi)/2]即可。面對不同的數(shù)據(jù),具體怎么來選擇這個(gè)隨機(jī)基準(zhǔn)數(shù)沒有特定的方法。一般就取第一個(gè)元素或中間元素即可。
隨機(jī)基準(zhǔn)數(shù)選取的不好,可能出現(xiàn)這樣的結(jié)果(以選取第一個(gè)元素為例):比較了一圈發(fā)現(xiàn),基準(zhǔn)數(shù)只向后移動了兩三位就到了其應(yīng)在位置。那么其左邊的無序數(shù)組很小,右邊的無序數(shù)組很大。在為右邊的無序數(shù)組選擇的基準(zhǔn)數(shù)找位置時(shí),要找很多次。這就增加了計(jì)算時(shí)間。最好是每次為基準(zhǔn)數(shù)找好位置時(shí),其位置為當(dāng)前數(shù)組的最中間,那樣左右兩邊的無序數(shù)組大小相同。
2.不斷遞歸調(diào)用時(shí),當(dāng)前的無序數(shù)組規(guī)模是在不斷減小的,當(dāng)規(guī)模減小到一定程度可以用插入排序代替快速排序。插入排序在小規(guī)模數(shù)據(jù)中排序速度更快。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的排序算法C#实现之快速排序详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前沿篇:西门子博图指令(指令含义)(工控
- 下一篇: C# 操作word 指定书签位置插入图片