全速加载中

快速排序算法

快速排序采用一种“分而治之、各个击破”的观念。

快速排序使用分治法(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 }

 

posted @ 2014-10-10 11:56  许鸿飞  阅读(250)  评论(0编辑  收藏  举报