CSharp examples for Data Structure Algorithm:Sort
Sort the array with merge sort.
using System;/*from ww w . j ava2 s . c om*/ public class MainClass { static void Main() { var generator = new Random(); var data = new int[10]; for (var i = 0; i < data.Length; ++i) { data[i] = generator.Next(10, 100); } Console.WriteLine("Unsorted array:"); Console.WriteLine(string.Join(" ", data) + "\n"); // display array MergeSort(data); // sort array Console.WriteLine("Sorted array:"); Console.WriteLine(string.Join(" ", data) + "\n"); // display array } public static void MergeSort(int[] values) { SortArray(values, 0, values.Length - 1); // sort entire array } // splits array, sorts subarrays and merges subarrays into sorted array private static void SortArray(int[] values, int low, int high) { // test base case; size of array equals 1 if ((high - low) >= 1) // if not base case { int middle1 = (low + high) / 2; // calculate middle of array int middle2 = middle1 + 1; // calculate next element over // output split step Console.WriteLine($"split: {Subarray(values, low, high)}"); Console.WriteLine($" {Subarray(values, low, middle1)}"); Console.WriteLine($" {Subarray(values, middle2, high)}"); // split array in half; sort each half (recursive calls) SortArray(values, low, middle1); // first half of array SortArray(values, middle2, high); // second half of array // merge two sorted arrays after split calls return Merge(values, low, middle1, middle2, high); } } // merge two sorted subarrays into one sorted subarray private static void Merge(int[] values, int left, int middle1, int middle2, int right) { int leftIndex = left; // index into left subarray int rightIndex = middle2; // index into right subarray int combinedIndex = left; // index into temporary working array int[] combined = new int[values.Length]; // working array // output two subarrays before merging Console.WriteLine($"merge: {Subarray(values, left, middle1)}"); Console.WriteLine($" {Subarray(values, middle2, right)}"); // merge arrays until reaching end of either while (leftIndex <= middle1 && rightIndex <= right) { // place smaller of two current elements into result and move to next space in arrays if (values[leftIndex] <= values[rightIndex]) { combined[combinedIndex++] = values[leftIndex++]; } else { combined[combinedIndex++] = values[rightIndex++]; } } // if left array is empty if (leftIndex == middle2) { // copy in rest of right array while (rightIndex <= right) { combined[combinedIndex++] = values[rightIndex++]; } } else // right array is empty { // copy in rest of left array while (leftIndex <= middle1) { combined[combinedIndex++] = values[leftIndex++]; } } // copy values back into original array for (int i = left; i <= right; ++i) { values[i] = combined[i]; } // output merged array Console.WriteLine($" {Subarray(values, left, right)}"); Console.WriteLine(); } public static string Subarray(int[] values, int low, int high) { string temporary = string.Empty.PadLeft(low * 3); for (int i = low; i <= high; ++i) { temporary += $" {values[i]}"; } return temporary; } }