算法:快速排序(Quick Sort)

算法定义

目前学习是五种排序(冒泡、插入、选择、合并、快速)中,快速排序是最让我喜欢的算法(因为我想不到),其定义如下:

  • 随机的从数组中选择一个元素,如:item。
  • 对数组进行分区,将小于等于 item 的元素移动到 item 左边,将大于 item 的元素移动到 右边,移动过程 item 的位置也有可能发生变化的。
  • 分区后 item 的位置为 ItemIndex,递归的对 0 至 ItemIndex -1 和 ItemIndex + 1 至 length -1 部分执行递归。

算法举例

【5,4,3,2,1】

【5,43,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 }
原文地址:https://www.cnblogs.com/happyframework/p/3464682.html