排序算法1:快速排序
今儿闲着,实现了下一维数组快速排序算法。
快速排序分三个步骤(参考维基百科:http://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F):
1.选取一个基准值。(一般以第一个为基准)
2.重新排序,所有比基准小的都放在左边,所有比基准大的都放在右边。排序过后,该基准处于数列中间位置。(分治法中的分,以基准值为中心,分为左右两个分区)
3.递归的按照1、2两步骤排序左右两个分区。
控制台程序如下:
方法1:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ConsoleApplication1 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 SortTest myTest = new SortTest(); 13 myTest.SetMyArray(10); 14 for (int i = 0; i < 10; i++) 15 { 16 Console.WriteLine(myTest.myArray[i]); 17 } 18 Console.WriteLine("快速排序"); 19 myTest.QuickSort(myTest.myArray,0,9); 20 for (int i = 0; i < 10; i++) 21 { 22 Console.WriteLine(myTest.myArray[i]); 23 } 24 } 25 } 26 27 class SortTest 28 { 29 public int[] myArray; 30 31 /// <summary> 32 /// 生成数组 33 /// </summary> 34 /// <param name="length"></param> 35 public void SetMyArray(int length) 36 { 37 System.Random random = new Random(); 38 myArray = new int[length]; 39 for (int i = 0; i < length; i++) 40 { 41 myArray[i] = random.Next(100); 42 } 43 } 44 45 /// <summary> 46 /// 排序分割 47 /// </summary> 48 /// <param name="array"></param> 49 /// <param name="low"></param> 50 /// <param name="high"></param> 51 /// <returns></returns> 52 public int ReturnIndex(int[] array,int low,int high) 53 { 54 int xMark = array[low]; 55 while (low < high) 56 { 57 //从右往左 58 while (array[high] > xMark && low < high) 59 { 60 high--; 61 } 62 if (low < high) 63 { 64 array[low] = array[high]; 65 low++; 66 } 67 //从左往右 68 while (array[low] < xMark && low < high) 69 { 70 low++; 71 } 72 if (low < high) 73 { 74 array[high] = array[low]; 75 high--; 76 } 77 } 78 array[low] = xMark; 79 return low; 80 } 81 82 /// <summary> 83 /// 快速排序 84 /// </summary> 85 /// <param name="array"></param> 86 /// <param name="low"></param> 87 /// <param name="high"></param> 88 public void QuickSort(int[] array, int low, int high) 89 { 90 if (low < high) 91 { 92 int index = ReturnIndex(array, low, high); 93 QuickSort(array, low, index - 1);//递归调用 94 QuickSort(array, index + 1, high); 95 } 96 } 97 } 98 }
方法2:维基百科中的方法,比第一个简洁,看着舒服。
public static void Sort(int[] numbers) { Sort(numbers, 0, numbers.Length - 1); } private static void Sort(int[] numbers, int left, int right) { if (left < right) { int middle = numbers[(left + right)/2]; int i = left -1; int j = right +1; while (true) { while (numbers[++i] < middle) ; while (numbers[--j] > middle) ; if (i >= j) break; Swap(numbers,i,j); } Sort(numbers, left, i-1); Sort(numbers, j+1, right); } } private static void Swap(int[] numbers, int i, int j) { int number = numbers[i]; numbers[i] = numbers[j]; numbers[j] = number; }
浙公网安备 33010602011771号