日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

排序算法C#实现之快速排序详解

發(fā)布時(shí)間:2023/12/31 C# 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法C#实现之快速排序详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

【任務(wù)目標(biāo)】

將一組大規(guī)模無序數(shù)組變?yōu)橛行?/p>

【快速排序原理】

  • 在數(shù)組中隨機(jī)選擇一個(gè)數(shù)作為基準(zhǔn)數(shù)temp,
  • 在數(shù)組中從后往前找一個(gè)比temp小的數(shù)lo,交換lo和temp
  • 在數(shù)組中從前往后找一個(gè)比temp大的數(shù)hi,交換temp和hi
  • 重復(fù)2、3找lo和hi,直到找不到這樣的數(shù)lo,hi。此時(shí)temp左邊的數(shù)都<=它,右邊的數(shù)都>=它。此時(shí)temp所在位置就是數(shù)組有序后其應(yīng)該在的位置
  • 將temp左邊的數(shù)看做一個(gè)無序數(shù)組,重復(fù)步驟1-4,又會得到一個(gè)新的temp
  • 將temp右邊的數(shù)看做一個(gè)無序數(shù)組,重復(fù)步驟1-4,又會得到一個(gè)新的temp
  • 得到新的temp后再重復(fù)步驟5、6,直到temp左邊和右邊都沒有無序數(shù)組了,此時(shí)整個(gè)數(shù)組有序
  • 將上述步驟轉(zhuǎn)換為程序語言時(shí),有些地方要注意:

  • 在步驟2,3中,temp的位置在不停地被交換,只有在步驟4中找到位置時(shí)才確定其所在。而在程序中把temp取出,相當(dāng)于空出來一個(gè)位置,把接下來要和temp交換的位置處的數(shù)值賦值給這個(gè)空位置即可。
  • 在步驟2中從后往前找,實(shí)際上就是數(shù)組索引從最大值不斷減小找;在步驟3中從前往后找,實(shí)際上就是數(shù)組索引從最小值不斷增大來找
  • 步驟5,6中的左邊無序數(shù)組的索引最小值就是當(dāng)前數(shù)組的最小值,最大值是temp所在位置索引減1;右邊無序數(shù)組的索引最小值是temp所在位置索引加1,最大值是當(dāng)前數(shù)組的最大值
  • 步驟5-7顯然是要遞歸
  • 【快速排序原理概括】

    通過不斷比較將小數(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。