در این مقاله، به بررسی برخی از مهمترین متدهای مرتب سازی آرایه ها در سی شارپ «#Sorting arrays in C» و نحوه استفاده از آنها خواهیم پرداخت. همچنین به تشریح و توضیح نحوه استفاده از متدهای مختلف Sort در کلاس Array پرداخته و در هر روش به بررسی نحوه عملکرد، پارامترها و استثناهای مربوط به آنها خواهیم پرداخت.
مقدمه
در زبان برنامهنویسی #C، مرتبسازی دادهها یکی از عملیاتهای اساسی است که در بسیاری از برنامهها مورد استفاده قرار میگیرد. برای انجام این کار، کلاس Array در #C از متدهای مختلفی برخوردار است که به برنامهنویسان این امکان را میدهد تا به راحتی آرایهها را مرتب کنند. یکی از پرکاربردترین این متدها، متد ()Array.Sort است که به شیوههای مختلفی آرایهها را با استفاده از معیارهای مختلف مرتب میکند.
انواع متد های مرتب سازی آرایه ها در سی شارپ
Array.Sort برای مرتبسازی عناصر در یک آرایه یکبعدی استفاده میشود. در لیست بارگذاری این متد ۱۷ روش به شرح زیر وجود دارد:
- متد Sort<T>(T[ ])
- متد Sort<T>(T[], IComparer<T>)
- متد Sort<T>(T[], Int32, Int32)
- متد Sort<T>(T[], Comparison<T>)
- متد Sort(Array, Int32, Int32, IComparer)
- متد Sort(Array, Array, Int32, Int32, IComparer)
- متد Sort(Array, Int32, Int32)
- متد Sort(Array, Array, Int32, Int32)
- متد Sort(Array, IComparer)
- متد Sort(Array, Array, IComparer)
- متد Sort(Array, Array)
- متد Sort(Array)
- متد Sort<T>(T[], Int32, Int32, IComparer<T>)
- متد Sort<TKey,TValue>(TKey[], TValue[])
- متد Sort<TKey,TValue>(TKey[], TValue[], IComparer<TKey>)
- متد Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32)
- متد Sort<TKey,TValue>(TKey[], TValue[], Int32, Int32, IComparer<TKey>)
در ادامه، ما به تشریح ۴ متد اول در مرتب سازی آرایه ها در سی شارپ میپردازیم.
متد Sort در سی شارپ
این روش سادهترین راه برای مرتب سازی آرایه ها در سی شارپ است. این متد به صورت خودکار آرایه را به ترتیب صعودی (از کوچک به بزرگ) مرتب میکند.
این متد عناصر یک آرایه را با استفاده از پیادهسازی رابط IComparable>T> برای هر عنصر از آرایه مرتب میکند. بنابراین، نوع دادهای مورد استفاده باید این رابط را پیادهسازی کند.
پیادهسازی داخلی متد Sort از الگوریتمهای مرتبسازی سریع (QuickSort)، درج (Insertion Sort) و سایر روشهای کارآمد استفاده میکند که بسته به اندازه و نوع دادههای آرایه، بهترین عملکرد را ارائه میدهد.
ساختار یا نحو متد Sort در سی شارپ
متد Sort در سیشارپ به شما اجازه میدهد تا آرایهای از نوع مشخص شده (generic type) را به ترتیب صعودی مرتب کنید. در واقع، این متد یکی از متدهای کلاس Array است که در فضای نام System قرار دارد.
ساختار آن به صورت زیر است:
public static void Sort<T> (T[] array);
پارامتر «Parameter»:
- array آرایه یکبعدی و مبتنی بر صفر است که باید مرتب شود.
استثناها «Exceptions»:
- اگر آرایه خالی (null) باشد، خطای ArgumentNullException رخ میدهد.
- اگر عناصر آرایه قابل مقایسه «Comparable» نباشند، خطای InvalidOperationException ایجاد میشود.
نحوه استفاده: این متد به صورت مستقیم روی آرایه فراخوانی میشود و پس از فراخوانی آن، آرایه به طور خودکار به ترتیب صعودی مرتب خواهد شد.
مثال متد Sort در سی شارپ
تکه کد زیر که به زبان سی شارپ نوشته شده از متد Array.Sort<T>(T[]) برای مرتبسازی یک آرایه استفاده میکند.
هدف این برنامه، نمایش نحوه مرتبسازی آرایه، سپس جستجوی باینری برای یافتن موقعیت یک عنصر و تعیین محدودهای است که یک عنصر میتواند در آن قرار گیرد.
// C# Program to illustrate the use // of the Array.Sort<T>(T[]) Method using System; using System.Collections.Generic; class PStore { // Main Method public static void Main() { // array elements string[] arr = new string[5] { "A", "D", "X", "G", "M" }; foreach(string g in arr) { Console.WriteLine(g); // display original array } Console.WriteLine("\nAfter Sort:"); Array.Sort(arr); foreach(string g in arr) { Console.WriteLine(g); // display sorted array } Console.WriteLine("\nB sorts between :"); // binary Search for "B" int index = Array.BinarySearch(arr, "B"); // call "sortT" function // which is the Sort<T>(T[]) function sortT(arr, index); Console.WriteLine("\nF sorts between :"); index = Array.BinarySearch(arr, "F"); sortT(arr, index); } public static void sortT<T>(T[] arr, int index) { // If the index is negative, // it represents the bitwise // complement of the next larger // element in the array. if (index < 0) { index = ~index; if (index == 0) Console.Write("beginning of array"); else Console.Write("{0} and ", arr[index - 1]); if (index == arr.Length) Console.WriteLine("end of array."); else Console.WriteLine("{0}", arr[index]); } } }
خروجی
A D X G M After Sort: A D G M X B sorts between : A and D F sorts between : D and G
توضیحات:
- در مثال بالا متد Array.Sort آرایه را به ترتیب صعودی مرتب میکند.
- متد Array.BinarySearch برای جستجو در آرایه مرتبشده و پیدا کردن موقعیت دقیق یا تقریبی یک عنصر استفاده میشود.
- اگر یک عنصر پیدا نشود، متد sortT اطلاعات مربوط به مکان احتمالی آن در آرایه را نمایش میدهد.
- عملگر ~ برای محاسبه مکان تقریبی زمانی که جستجو در آرایه موفق نباشد، استفاده میشود.
متد مرتب سازی مقایسه ای در سی شارپ
متد مرتبسازی مقایسهای (Comparison-based Sorting) یکی دیگر از روشهای مرتب سازی آرایه ها در سی شارپ است. در این روش، بهجای استفاده از رابط IComparable<T> برای مقایسه عناصر، از رابط IComparer<T> استفاده میشود. این متد به شما امکان میدهد که مرتبسازی سفارشی و دقیقتری را بر اساس مقایسههای خودتان پیادهسازی کنید.
این روش برای زمانی که نیاز به مرتبسازی بر اساس معیارهای خاص (مانند فیلدهای خاص یا ویژگیهای سفارشی) دارید، بسیار مناسب است.
ساختار یا نحو مرتب سازی مقایسه ای
ساختار یا نحو متد Sort<T>(T[] array, IComparer<T> comparer) در زبان #C برای مرتبسازی آرایهها با استفاده از یک مقایسهکننده سفارشی «custom comparer» است. این متد اجازه میدهد تا شما خودتان مشخص کنید که عناصر چگونه باید مقایسه شوند و بر اساس آن آرایه را مرتب کنید.
ساختار این متد به شکل زیر است:
public static void Sort<T> (T[] array, System.Collections.Generic.IComparer<T> comparer);
پارامترها:
- T نوع عناصر آرایه است.
- array آرایه یکبعدی که قرار است مرتب شود.
- comparer پیادهسازی رابط عمومی IComparer<T> برای مقایسه عناصر یا null برای استفاده از پیادهسازی رابط عمومی IComparable<T> برای هر عنصر.
استثناها:
- ArgumentNullException: اگر آرایه مقدار null داشته باشد.
- InvalidOperationException: اگر مقدار comparer برابر null باشد و هیچ پیادهسازی از IComparable<T> برای عناصر موجود نباشد.
- ArgumentException: اگر پیادهسازی comparer در حین مرتبسازی باعث خطا شود.
مثال متد مرتب سازی مقایسه ای در سی شارپ
تکه کد زیر که به زبان سی شارپ نوشته شده از متد Array.Sort<T>(T[], IComparer<T>) برای مرتبسازی یک آرایه استفاده میکند.
// C# program to demonstrate the use of the // Array.Sort<T>(T[], IComparer<T>) method using System; using System.Collections.Generic; public class PStore : IComparer<string> { public int Compare(string x, string y) { // Compare x and y in reverse order. return x.CompareTo(y); } } class Program { // Main Method public static void Main() { // array elements string[] arr = new string[5] {"A", "D", "X", "G", "M" }; foreach(string g in arr) { // display original array Console.WriteLine(g); } Console.WriteLine("\nAfter Sort: "); PStore gg = new PStore(); // Sort<T>(T[], IComparer<T>) method Array.Sort(arr, gg); foreach(string g in arr) { // display sorted array Console.WriteLine(g); } Console.WriteLine("\nD Sorts between :"); // binary Search for "D" int index = Array.BinarySearch(arr, "D"); // call "sortT" function sortT(arr, index); Console.WriteLine("\nF Sorts between :"); index = Array.BinarySearch(arr, "F"); sortT(arr, index); } public static void sortT<T>(T[]arr, int index) { if (index < 0) { // If the index is negative, // it represents the bitwise // complement of the next // larger element in the array. index = ~index; Console.Write("Not found. Sorts between: "); if (index == 0) Console.Write("Beginning of array and "); else Console.Write("{0} and ", arr[index-1]); if (index == arr.Length) Console.WriteLine("end of array."); else Console.WriteLine("{0}.", arr[index]); } else { Console.WriteLine("Found at index {0}.", index); } } }
خروجی
A D X G M After Sort: A D G M X D Sorts between : Found at index 1. F Sorts between : Not found. Sorts between: D and G.
توضیحات:
- در مثال بالا، از رابط IComparer<T> برای سفارشیسازی نحوه مقایسه و مرتبسازی استفاده شده است.
- از متد Array.Sort<T>(T[], IComparer<T>) برای مرتبسازی یک آرایه استفاده میکند.
- از متد Array.BinarySearch برای جستجوی باینری و بررسی موقعیت یک عنصر در آرایه مرتبشده استفاده میکند.
- با استفاده از عملیات bitwise اطلاعات در مورد موقعیت یا جایگاه احتمالی یک عنصر در آرایه را نمایش میدهد.
متد Sort در سی شارپ برای مرتب سازی بخش خاصی از آرایه
متد Sort<T>(T[], Int32, Int32, IComparer<T>) در سی شارپ یک نسخه خاص از متد Sort است که به شما این امکان را میدهد که فقط یک بخش خاص از آرایه را مرتب کنید. این متد از رابط IComparable<T> برای مقایسه عناصر استفاده میکند، بنابراین عناصر آرایه باید قابلیت مقایسه داشته باشند.
این متد میتواند برای مرتبسازی بخشی از آرایه (از یک شاخص خاص تا یک طول معین) مفید باشد.
میتوانید با مشخص کردن شاخص شروع (index) و طول بخش (length)، قسمتی از آرایه را که نیاز به مرتبسازی دارید، مشخص کنید.
ساختار:
public static void Sort<T> (T[] array, int index, int length);
پارامترها:
- array آرایه یک بعدی و صفر-پایهای است که قرار است مرتب شود.
- index شاخص شروع محدودهای است که باید مرتب شود.
- length تعداد عناصری است که باید در محدوده مرتب شوند.
استثناها:
- اگر آرایه نال باشد خطای ArgumentNullException رخ میدهد..
- اگر شاخص کمتر از مرز پایین آرایه باشد یا طول کمتر از صفر باشد، خطای ArgumentOutOfRangeException رخ میدهد.
- اگر شاخص و طول محدوده معتبری در آرایه مشخص نکنند، خطای ArgumentException رخ میدهد.
- اگر یکی از عناصر آرایه یا بیشتر رابط IComparable<T> را پیادهسازی نکرده باشد، خطای InvalidOperationException رخ میدهد.
مثال برای مرتب سازی بخشی از آرایه در سی شارپ
تکه کد زیر که به زبان سیشارپ است به طور خاص از متد Array.Sort<T>(T[], Int32, Int32) برای مرتبسازی بخش خاصی از یک آرایه استفاده میکند. همچنین، از یک کلاس سفارشی که رابط IComparer<string> را پیادهسازی میکند، برای انجام مرتبسازی معکوس در بخشی از آرایه استفاده میکند.
// C# program to demonstrate the use of // Array.Sort<T>(T[], Int32, Int32) method using System; using System.Collections.Generic; public class PStore : IComparer<string> { public int Compare(string x, string y) { // Compare y and x in reverse order. return y.CompareTo(x); } } public class Example { // Main Method public static void Main() { // Array elements string[] arr = {"AB", "CD", "GH", "EF", "MN", "IJ"}; Console.WriteLine("آرایه اصلی"); Display(arr); Console.WriteLine("\nآرایه را بین شاخص ۱ تا ۴ مرتب کنید "); // Array.Sort(T[], Int32, Int32) method // sort will happen in between // index 1 to 4 Array.Sort(arr, 1, 4); Display(arr); Console.WriteLine("\nآرایه را به صورت معکوس"+ " بین شاخص ۱ تا ۴ مرتب کنید"); // sort will happen in between // index 1 to 4 reversely Array.Sort(arr, 1, 4, new PStore()); Display(arr); } public static void Display(string[] arr) { foreach(string g in arr) { Console.WriteLine(g); } } }
خروجی
آرایه اصلی AB CD GH EF MN IJ آرایه را بین شاخص ۱ تا ۴ مرتب کنید AB CD EF GH MN IJ آرایه را به صورت معکوس بین شاخص ۱ تا ۴ مرتب کنید AB MN GH EF CD IJ
توضیحات:
- در مثال بالا متد Array.Sort<T>(T[], Int32, Int32) بخش خاصی از یک آرایه را مرتب میکند. در اینجا، بخش از شاخص ۱ تا ۴ مرتب شده است.
- با استفاده از کلاس PStore که رابط IComparer<string> را پیادهسازی کرده است، مرتبسازی معکوس در بخشی از آرایه انجام میشود.
- برای نمایش آرایهها قبل و بعد از مرتبسازی، از متد Display استفاده شده است.
مرتبسازی سفارشی آرایه ها در سی شارپ با تابع مقایسه
متد Array.Sort<T>(T[], Comparison<T>) یکی از روشهای مرتب سازی آرایه ها در سی شارپ است که به شما این امکان را میدهد که از یک تابع مقایسه سفارشی برای مرتبسازی آرایه استفاده کنید. این متد مخصوصاً زمانی کاربرد دارد که بخواهید ترتیب خاصی برای مرتبسازی تعیین کنید، مانند مرتبسازی به صورت نزولی یا مرتبسازی بر اساس معیارهای خاص.
متد Sort تنها یک تابع مقایسه را به عنوان پارامتر میپذیرد که شما آن را خودتان تعریف میکنید و به سی شارپ میگویید که عناصر چگونه مقایسه شوند.
ساختار
public static void Sort<T> (T[] array, Comparison<T> comparison);
پارامترها:
- array آرایه یک بعدی و صفر-پایهای است که قرار است مرتب شود.
- comparison تابع مقایسهای که نحوه مرتبسازی را تعیین میکند.
استثناها:
- اگر آرایه یا تابع مقایسه «comparison» خالی «Null» باشند، خطای ArgumentNullException رخ میدهد.
- اگر تابع مقایسه درست عمل نکند، خطای ArgumentException ایجاد میشود.
مثال برای استفاده از تابع مقایسه سفارشی
برنامه زیر به زبان سیشارپ از متد Array.Sort<T>(T[], Comparison<T>) برای مرتبسازی یک آرایه از رشتهها استفاده میکند. در این برنامه، یک مقایسهگر سفارشی (با نام CompareComp) برای تعیین ترتیب مرتبسازی به کار میرود.
// C# program to demonstrate the use of the // Array.Sort<T>(T[ ], Comparison<T>) Method using System; using System.Collections.Generic; class PStore { private static int CompareComp(string x, string y) { if (y == null && x == null) { // If x and y is null // then x and y are same return 0; } else { // If x is null but y is not // null then y is greater. return -1; } } // Main method public static void Main() { string[] arr = {"Java", "C++", "Scala", "C", "Ruby", "Python"}; Console.WriteLine("Original Array: "); // display original array Display(arr); Console.WriteLine("\nSort with Comparison: "); // Array.Sort<T>(T[], Comparison<T>) // Method Array.Sort(arr, CompareComp); // display sorted array Display(arr); } // Display function public static void Display(string[] arr) { foreach(string g in arr) { Console.WriteLine(g); } } }
خروجی برنامه به صورت زیر خواهد بود:
Original Array: Java C++ Scala C Ruby Python Sort with Comparison: Python Ruby C Scala C++ Java
توضیحات:
- در مثال بالا متد Array.Sort<T>(T[], Comparison<T>) برای مرتبسازی آرایهها استفاده میشود و به شما این امکان را میدهد که مقایسهگر سفارشی خود را برای تعیین ترتیب مرتبسازی تعریف کنید.
- در متد CompareComp مقایسهگر طوری پیادهسازی شده است که رشتهها به صورت معکوس مرتب میشوند (یعنی از بیشترین به کمترین).
- متد Display برای نمایش آرایه قبل و بعد از مرتبسازی استفاده شده است.
سخن آخر
در این مقاله، به بررسی چهار متد مختلف برای مرتب سازی آرایه ها در سی شارپ پرداختیم. هر یک از این متدها امکانات خاص خود را برای مرتبسازی دادهها با استفاده از رابطهای مختلفی مانند IComparable>T> و IComparer>T> فراهم میآورد. استفاده از این متدها به برنامهنویسان این امکان را میدهد تا بسته به نیاز خود، روش مرتبسازی مناسب را انتخاب کنند. همچنین، با درک استثناها و پارامترهای هر متد، میتوانند از بروز خطاهای احتمالی جلوگیری کنند و کدهایی کارآمد و قابل اعتماد بنویسند. در نهایت، انتخاب روش مرتبسازی به ویژگیهای خاص دادهها و نیازهای خاص برنامه بستگی دارد و آشنایی با این متدها به بهبود عملکرد و کارایی برنامهها کمک میکند.