76 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| 
 | |
| namespace NAudio.Utils
 | |
| {
 | |
|     class MergeSort
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// In-place and stable implementation of MergeSort
 | |
|         /// </summary>
 | |
|         static void Sort<T>(IList<T> list, int lowIndex, int highIndex, IComparer<T> comparer)
 | |
|         {
 | |
|             if (lowIndex >= highIndex)
 | |
|             {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
| 
 | |
|             int midIndex = (lowIndex + highIndex) / 2;
 | |
| 
 | |
| 
 | |
|             // Partition the list into two lists and Sort them recursively
 | |
|             Sort(list, lowIndex, midIndex, comparer);
 | |
|             Sort(list, midIndex + 1, highIndex, comparer);
 | |
| 
 | |
|             // Merge the two sorted lists
 | |
|             int endLow = midIndex;
 | |
|             int startHigh = midIndex + 1;
 | |
| 
 | |
| 
 | |
|             while ((lowIndex <= endLow) && (startHigh <= highIndex))
 | |
|             {
 | |
|                 // MRH, if use < 0 sort is not stable
 | |
|                 if (comparer.Compare(list[lowIndex], list[startHigh]) <= 0)
 | |
|                 {
 | |
|                     lowIndex++;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     // list[lowIndex] > list[startHigh]
 | |
|                     // The next element comes from the second list, 
 | |
|                     // move the list[start_hi] element into the next 
 | |
|                     //  position and shuffle all the other elements up.
 | |
|                     T t = list[startHigh];
 | |
| 
 | |
|                     for (int k = startHigh - 1; k >= lowIndex; k--)
 | |
|                     {
 | |
|                         list[k + 1] = list[k];
 | |
|                     }
 | |
| 
 | |
|                     list[lowIndex] = t;
 | |
|                     lowIndex++;
 | |
|                     endLow++;
 | |
|                     startHigh++;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// MergeSort a list of comparable items
 | |
|         /// </summary>
 | |
|         public static void Sort<T>(IList<T> list) where T : IComparable<T>
 | |
|         {
 | |
|             Sort(list, 0, list.Count - 1, Comparer<T>.Default);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// MergeSort a list 
 | |
|         /// </summary>
 | |
|         public static void Sort<T>(IList<T> list, IComparer<T> comparer)
 | |
|         {
 | |
|             Sort(list, 0, list.Count - 1, comparer);
 | |
|         }
 | |
|     }
 | |
| }
 |