算法定义
目前学习是五种排序(冒泡、插入、选择、合并、快速)中,快速排序是最让我喜欢的算法(因为我想不到),其定义如下:
- 随机的从数组中选择一个元素,如:item。
- 对数组进行分区,将小于等于 item 的元素移动到 item 左边,将大于 item 的元素移动到 右边,移动过程 item 的位置也有可能发生变化的。
- 分区后 item 的位置为 ItemIndex,递归的对 0 至 ItemIndex -1 和 ItemIndex + 1 至 length -1 部分执行递归。
算法举例
【5,4,3,2,1】
【5,4,3,2,1】
【4,5,3,2,1】
【1,5,3,2,4】
【1,4,3,2,5】
【1,2,3,4,5】
算法实现
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DataStuctureStudy.Sorts 8 { 9 class QuickSort<T> 10 where T : IComparable<T> 11 { 12 private static Random _random = new Random(); 13 14 private static void Swap(T[] items, int left, int right) 15 { 16 if (left != right) 17 { 18 var temp = items[left]; 19 items[left] = items[right]; 20 items[right] = temp; 21 } 22 } 23 24 public static void Sort(T[] items) 25 { 26 if (items.Length < 2) 27 { 28 return; 29 } 30 31 Sort(items, 0, items.Length - 1); 32 } 33 34 private static void Sort(T[] items, int left, int right) 35 { 36 if (left >= right) 37 { 38 return; 39 } 40 41 var pivotIndex = _random.Next(left, right); 42 var newPivotIndex = Partition(items, left, right, pivotIndex); 43 44 Sort(items, left, pivotIndex - 1); 45 Sort(items, pivotIndex + 1, right); 46 } 47 48 private static object Partition(T[] items, int left, int right, int pivotIndex) 49 { 50 T pivotValue = items[pivotIndex]; 51 52 Swap(items, pivotIndex, right); 53 var newPivotValue = right; 54 55 for (var i = left; i < right; i++) 56 { 57 if (items[i].CompareTo(pivotValue) > 0) 58 { 59 Swap(items, i, newPivotValue); 60 newPivotValue = i; 61 } 62 } 63 64 return newPivotValue; 65 } 66 } 67 }