标签:style blog color io 使用 ar for strong sp
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:
1、从数列中挑出一个元素,称为 "基准"(pivot),
2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
下面是一个小例子:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Quicksofttest 8 { 9 class Program 10 { 11 private static int[] values =new int[20];// {0, 1, 345, 2, 3, 45, 7, 43, 3, 6, 45, 345, 45, 32, 3, 75, 576, 56, 3, 2, 3456 }; 12 static void Main(string[] args) 13 { 14 Console.WriteLine("原來數組為:"); 15 Random radom = new Random(); 16 for (int i = 0; i < 20; i++) 17 { 18 values[i] = radom.Next(100); 19 Console.Write(values[i]+" "); 20 } 21 Quicksoft(0,values.Length-1); 22 Console.WriteLine(""); 23 Console.WriteLine("***********************************"); 24 Console.WriteLine("排序后:"); 25 foreach (var item in values) 26 { 27 Console.Write(item + " "); 28 } 29 Console.Read(); 30 } 31 32 private static void Quicksoft(int left, int right) 33 { 34 if (left>right) 35 { 36 return; 37 } 38 int temp= values[left]; 39 int i = left; 40 int j = right; 41 while (i != j) 42 { 43 //從右向左開始查找 44 while (values[j] >= temp&&i<j) 45 { 46 j--; 47 } 48 while (values[i] <= temp&&i<j) 49 { 50 i++; 51 } 52 if (i<j) 53 { 54 int t = values[i]; 55 values[i] = values[j]; 56 values[j] = t; 57 } 58 values[left] = values[i]; 59 values[i] = temp; 60 Quicksoft(left,i-1); 61 Quicksoft(i+1, right); 62 63 } 64 } 65 66 67 68 } 69 }
标签:style blog color io 使用 ar for strong sp
原文地址:http://www.cnblogs.com/xuhongfei/p/4015507.html