常见排序算法的实现和比较

  1     class Program
  2     {
  3 
  4         static void Main(string[] args)
  5         {
  6             int[] arr = new int[] { 2, 4, 1, 7, 4, 9, 6, 0, 1, 5, 8, 3 };
  7             List<int> list = MergeSort(arr.ToList<int>());
  8 
  9             foreach (int num in list)
 10                 Console.WriteLine(num);
 11         }
 12 
 13 
 14         /// <summary>
 15         /// 7.
 16         /// 堆排序
 17         /// 不稳定
 18         /// nlogn
 19         /// </summary>
 20         public static void HeapSort(int[] arr)
 21         {
 22             if (arr == null || arr.Length < 1)
 23                 return;
 24 
 25             //构建堆
 26             for (int i = arr.Length / 2; i >= 0; i--)
 27             {
 28                 AdjustHeap(arr, i, arr.Length);
 29             }
 30 
 31             //堆排序
 32             for (int i = arr.Length - 1; i > 0; i--)
 33             {
 34                 Swap(arr, 0, i);
 35                 AdjustHeap(arr, 0,i);
 36             }
 37         }
 38 
 39         /// <summary>
 40         /// 调整大根堆
 41         /// </summary>
 42         public static void AdjustHeap(int[] arr,int index,int len)
 43         {
 44             int left = index * 2 + 1;
 45             int right = index * 2 + 2;
 46             int large = index;
 47 
 48             if(left< len && arr[left]>arr[large])
 49                 large = left;
 50 
 51             if (right < len && arr[right] > arr[large])
 52                 large = right;
 53 
 54             if (large != index)
 55             {
 56                 Swap(arr, large, index);
 57                 AdjustHeap(arr, large, len);
 58             }
 59         }
 60 
 61         /// <summary>
 62         /// 6.
 63         /// 归并排序
 64         /// 稳定
 65         /// nlogn
 66         /// </summary>
 67         public static List<int> MergeSort(List<int> list)
 68         {
 69             if (list == null || list.Count <= 1)
 70                 return list;
 71 
 72             List<int> left = new List<int>();
 73             List<int> right = new List<int>();
 74 
 75             int mid = list.Count / 2;
 76 
 77             for (int i = 0; i < mid; i++)
 78                 left.Add(list[i]);
 79 
 80             for (int i = mid; i < list.Count; i++)
 81                 right.Add(list[i]);
 82 
 83             left = MergeSort(left);
 84             right = MergeSort(right);
 85 
 86             return Merge(left, right);
 87         }
 88 
 89         public static List<int> Merge(List<int> left,List<int> right)
 90         {
 91             int lenL = left.Count;
 92             int lenR = right.Count;
 93             List<int> rs = new List<int>();
 94 
 95             while (left.Count > 0 && right.Count > 0)
 96             {
 97                 if (left[0] < right[0])
 98                 {
 99                     rs.Add(left[0]);
100                     left.RemoveAt(0);
101                 }
102                 else
103                 {
104                     rs.Add(right[0]);
105                     right.RemoveAt(0);
106                 }
107             }
108 
109             rs.AddRange(right.Count > 0 ? right : left);
110 
111             return rs;
112         }
113 
114         /// <summary>
115         /// 5.
116         /// 希尔排序
117         /// 不稳定
118         /// nlogn
119         /// </summary>
120         public static void ShellSort(int[] arr)
121         {
122             if (arr == null || arr.Length < 1)
123                 return;
124 
125             int gap = arr.Length / 2;
126 
127             for (; gap > 0; gap /= 2)
128             {
129                 for (int i = gap; i < arr.Length; i++)
130                 {
131                     int j = i;
132                     int temp = arr[i];
133 
134                     while (j-gap >= 0 && arr[j - gap] > temp)
135                     {
136                         arr[j] = arr[j - gap];
137                         j -= gap;
138                     }
139 
140                     arr[j] = temp;
141                 }
142             }
143         }
144 
145         /// <summary>
146         /// 4.
147         /// 快速排序
148         /// 不稳定
149         /// nlogn
150         /// </summary>
151         public static void QuickSort(int[] arr,int start,int end)
152         {
153             if (arr == null || arr.Length < 1 || start>=end)
154                 return;
155 
156             int mid = Partition(arr, start, end);
157 
158             QuickSort(arr, start, mid - 1);
159             QuickSort(arr, mid + 1, end);
160         }
161 
162         /// <summary>
163         /// Partition方法
164         /// </summary>
165         public static int Partition(int[] arr, int start, int end)
166         {
167             int key = arr[start];
168 
169             while (start < end)
170             {
171                 while (start < end && arr[end] >= key)
172                     end--;
173                 arr[start] = arr[end];
174 
175                 while (start < end && arr[start] <= key)
176                     start++;
177                 arr[end] = arr[start];
178             }
179 
180             arr[start] = key;
181 
182             return start;
183         }
184 
185         /// <summary>
186         /// 3.
187         /// 选择排序
188         /// 不稳定
189         /// n^2
190         /// </summary>
191         public static void SelectionSort(int[] arr)
192         {
193             if (arr == null || arr.Length < 1)
194                 return;
195 
196             for (int i = 0; i < arr.Length - 1; i++)
197             {
198                 int maxIndex = i;
199 
200                 for (int j = i + 1; j < arr.Length; j++)
201                 {
202                     maxIndex = arr[j] < arr[maxIndex] ? j : maxIndex;
203                 }
204 
205                 Swap(arr, i, maxIndex);
206             }
207         }
208 
209         /// <summary>
210         /// 2.
211         /// 插入排序
212         /// 稳定
213         /// n^2
214         /// </summary>
215         public static void InsertSort(int[] arr)
216         {
217             if (arr == null || arr.Length < 1)
218                 return;
219 
220             for (int i = 1; i < arr.Length; i++)
221             {
222                 for (int j = i - 1; j >= 0; j--)
223                 {
224                     if (arr[j] > arr[j + 1])
225                         Swap(arr, j, j + 1);
226                     else
227                         break;
228                 }
229             }
230         }
231 
232         /// <summary>
233         /// 1.
234         /// 冒泡排序
235         /// 稳定
236         /// n^2
237         /// </summary>
238         public static void BubbleSort(int[] arr)
239         {
240             if (arr == null || arr.Length < 1)
241                 return;
242 
243             for (int i = 0; i < arr.Length; i++)
244             {
245                 bool flag = true;
246 
247                 for (int j = 0; j < arr.Length - i - 1; j++)
248                 {
249                     if (arr[j] > arr[j + 1])
250                     {
251                         flag = false;
252                         Swap(arr, j, j + 1);
253                     }
254                 }
255 
256                 if (flag) return;
257             }
258         }
259 
260         /// <summary>
261         /// 交换数组中的两个数
262         /// </summary>
263         public static void Swap(int[] arr, int indexA, int indexB)
264         {
265             int temp = arr[indexA];
266             arr[indexA] = arr[indexB];
267             arr[indexB] = temp;
268         }
269     }
原文地址:https://www.cnblogs.com/HuoAA/p/4826403.html