慢慢講授疾速排序算法及C#版的完成示例。本站提示廣大學習愛好者:(慢慢講授疾速排序算法及C#版的完成示例)文章只能為提供參考,不一定能成為您想要的結果。以下是慢慢講授疾速排序算法及C#版的完成示例正文
算法思惟
疾速排序是C.R.A.Hoare於1962年提出的一種劃分交流排序。它采取了一種分治的戰略,平日稱其為分治法(Divide-and-ConquerMethod)。
該辦法的根本思惟是:
1.先從數列中掏出一個數作為基准數。
2.分區進程,將比這個數年夜的數全放到它的左邊,小於或等於它的數全放到它的右邊。
3.再對閣下區間反復第二步,直到各區間只要一個數。
固然疾速排序稱為分治法,但分治法這三個字明顯沒法很好的歸納綜合疾速排序的全體步調。是以我的對疾速排序作了進一步的解釋:挖坑填數+分治法:
先來看實例吧,界說上面再給出(最好能用本身的話來總結界說,如許對完成代碼會有贊助)。
以一個數組作為示例,取區間第一個數為基准數
初始時,i = 0; j = 9; X = a[i] = 72
因為曾經將a[0]中的數保留到X中,可以懂得成在數組a[0]上挖了個坑,可以將其它數據填充到這來。
從j開端向前找一個比X小或等於X的數。當j=8,相符前提,將a[8]挖出再填到上一個坑a[0]中。a[0]=a[8]; i++; 如許一個坑a[0]就被弄定了,但又構成了一個新坑a[8],這怎樣辦了?簡略,再找數字來填a[8]這個坑。此次從i開端向後找一個年夜於X的數,當i=3,相符前提,將a[3]挖出再填到上一個坑中a[8]=a[3]; j--;
數組變成:
i = 3; j = 7; X=72
再反復下面的步調,先從後向前找,再早年向後找。
從j開端向前找,當j=5,相符前提,將a[5]挖出填到上一個坑中,a[3] = a[5]; i++;
從i開端向後找,當i=5時,因為i==j加入。
此時,i = j = 5,而a[5]恰好又是前次挖的坑,是以將X填入a[5]。
數組變成:
可以看出a[5]後面的數字都小於它,a[5]前面的數字都年夜於它。是以再對a[0…4]和a[6…9]這二個子區間反復上述步調便可以了。
對挖坑填數停止總結
1.i =L; j = R; 將基准數挖出構成第一個坑a[i]。
2.j--由後向前找比它小的數,找到後挖出此數填前一個坑a[i]中。
3.i++由前向後找比它年夜的數,找到後也挖出此數填到前一個坑a[j]中。
4.再反復履行2,3二步,直到i==j,將基准數填入a[i]中。
C#完成示例
namespace QuickSort { public class QuickSortClass { public int Division(List<int> list, int left, int right) { //起首遴選一個基准元素 int baseNum = list[left]; while (left < right) { //從數組的右端開端向前找,一向找到比base小的數字為止(包含base一致數) while (left < right && list[right] >= baseNum) right = right - 1; //終究找到了比baseNum小的元素,要做的工作就是此元素放到base的地位 list[left] = list[right]; //從數組的左端開端向後找,一向找到比base年夜的數字為止(包含base一致數) while (left < right && list[left] <= baseNum) left = left + 1; //終究找到了比baseNum年夜的元素,要做的工作就是將此元素放到最初的地位 list[right] = list[left]; } //最初就是把baseNum放到該left的地位 list[left] = baseNum; //終究,我們發明left地位的左邊數值部門比left小,left地位右邊數值比left年夜 //至此,我們完成了第一篇排序 return left; } public void QuickSort(List<int> list, int left, int right) { //左下標必定小於右下標,不然就超出了 if (left < right) { //對數組停止朋分,掏出下次朋分的基准標號 int i = Division(list, left, right); //對“基准標號“左邊的一組數值停止遞歸的切割,以致於將這些數值完全的排序 QuickSort(list, left, i - 1); //對“基准標號“右邊的一組數值停止遞歸的切割,以致於將這些數值完全的排序 QuickSort(list, i + 1, right); } } } }