C#中Array.Sort()方法分析
Array.Sort()是在我們日常工作中非常常用的函數,不需要自己編寫排序算法就可以方便的對數組進行排序。
利用Array.Sort()排序具有以下特點:
排序是不穩定的
采用內省排序(introspective sort)
這里簡單解釋一下內省排序。內省排序會先以快速排序開始。在之前的文章分割鏈表中,我們接觸過快速排序。快速排序采用分治的思想,通過某一分界值將數組分成左右兩部分,將大于等于分界值的數據集中到右側,將小于分界值的數據集中到左側。然后分別對左側右側進行上述處理,直到每一側都排好序,那么整體也就排好序了。這一過程是一個遞歸的過程,如果數組很大,那么有可能該遞歸的深度會很深。最差情況,快排的時間復雜度會達到O(n^2)。而在內省排序中,當遞歸超過某一個深度d時,則會針對該深度d上的每一個劃分利用不同方法進行排序。
如果劃分的大小小于16個元素,對該劃分使用插入排序
如果劃分的大小超過2LogN, N是數組長度,那么就使用堆排序
如果劃分的大小介于兩者之間,則在該劃分上繼續使用快速排序 如下圖所示,在對原數組快速排序遞歸到某一深度時,對于小于16個元素的數組使用插入排序,對數組長度大于2LogN的數組采用堆排序,對介于兩者之間的數組仍然使用快速排序。我們可以看到,通過這種方式,我們避免了在更大數組上繼續使用快速排序,從而避免了快速排序最壞情況的出現。?
我們可以認為在內省排序中時間復雜度依然是O(nlogn)。
關于Array.Sort()的更詳細介紹可以參考 https://docs.microsoft.com/en-us/dotnet/api/system.array.sort?view=netframework-4.8
直接使用Array.Sort()會得到一個從小到大的排序好的結果。如果我們想得到一個從大到小排序好的結果我們要怎么辦呢?這里主要介紹三種方法。
using System; using System.Collections; using System.Linq; namespace SortPractice { public class IntReverseComparer : IComparer { public int Compare(object x, object y) { return (new CaseInsensitiveComparer()).Compare(y, x); } } class Program { static void Main(string[] args) { int[] arr1 = new int[] { 1, 9, 6, 7, 5, 9 }; // 方法1:利用Comparison委托函數 Array.Sort(arr1, new Comparison<int>((i1, i2) => i2.CompareTo(i1))); foreach(var a in arr1) { Console.Write(a + " "); } Console.WriteLine(); // 方法2:利用ICompare接口 int[] arr2 = new int[] { 1, 9, 6, 7, 5, 9 }; Array.Sort(arr2, new IntReverseComparer()); foreach(var a in arr2) { Console.Write(a + " "); } Console.WriteLine(); // 方法3:直接利用LINQ的OrderByDescending方法 int[] arr3 = new int[] { 1, 9, 6, 7, 5, 9 }; arr3 = arr3.OrderByDescending(c => c).ToArray(); foreach (var a in arr2) { Console.Write(a + " "); } Console.WriteLine(); } } }在上面的代碼中,第一種方法是利用Comparison委托函數。我們利用lamba expression來構建這個委托函數。如果我們用i1.CompareTo(i2)表示,則仍然是從小到大排序,將i1,i2互換后則變為從大到小排序。
第二種方法則是自己實現一個Comparer類,該類需要實現IComparer接口,并實現其中的Compare方法。
第三種方法則是直接利用LINQ中的OrderByDescending方法。
總結Array.Sort()作為C#中常用的排序算法,還是需要進行重點掌握的,這樣我們就可以根據自己的具體需要編寫自定義比較函數,從而方便快捷高效的解決日常開發中的各種排序問題了。
總結
以上是生活随笔為你收集整理的C#中Array.Sort()方法分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABP v1.0正式发布
- 下一篇: C#刷遍Leetcode面试题系列连载(