程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 慢慢講授疾速排序算法及C#版的完成示例

慢慢講授疾速排序算法及C#版的完成示例

編輯:C#入門知識

慢慢講授疾速排序算法及C#版的完成示例。本站提示廣大學習愛好者:(慢慢講授疾速排序算法及C#版的完成示例)文章只能為提供參考,不一定能成為您想要的結果。以下是慢慢講授疾速排序算法及C#版的完成示例正文


算法思惟
疾速排序是C.R.A.Hoare於1962年提出的一種劃分交流排序。它采取了一種分治的戰略,平日稱其為分治法(Divide-and-ConquerMethod)。
該辦法的根本思惟是:
1.先從數列中掏出一個數作為基准數。
2.分區進程,將比這個數年夜的數全放到它的左邊,小於或等於它的數全放到它的右邊。
3.再對閣下區間反復第二步,直到各區間只要一個數。
固然疾速排序稱為分治法,但分治法這三個字明顯沒法很好的歸納綜合疾速排序的全體步調。是以我的對疾速排序作了進一步的解釋:挖坑填數+分治法:
先來看實例吧,界說上面再給出(最好能用本身的話來總結界說,如許對完成代碼會有贊助)。
以一個數組作為示例,取區間第一個數為基准數

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810433684.png (272×152)

初始時,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--;
數組變成:

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810433679.png (255×143)

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]。
數組變成:

https://www.aspphp.online/bianchen/UploadFiles_4619/201707/2017072810433622.png (274×145)

可以看出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);
      }
    }
  }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved