• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

快速排序(C#实现)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

快排是对冒泡排序的一种改进。基本思想是:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

 

C#

快排递归实现:

 1         internal static void QuickSort(int[] inputArray, int lowIndex, int highIndex)
 2         {
 3             if (lowIndex >= highIndex)
 4             {
 5                 return;
 6             }
 7             int middleIndex = SortFunction(inputArray, lowIndex, highIndex);
 8             QuickSort(inputArray, lowIndex, middleIndex);
 9             QuickSort(inputArray, middleIndex + 1, highIndex);
10         }
11 
12         private static int SortFunction(int[] inputArray, int lowIndex, int highIndex)
13         {
14             int minValue = inputArray[lowIndex];
15             for (; highIndex > lowIndex; highIndex--)
16             {
17                 if (inputArray[highIndex] <= minValue)
18                 {
19                     inputArray[lowIndex] = inputArray[highIndex];
20                     for (; lowIndex < highIndex; lowIndex++)
21                     {
22                         if (inputArray[lowIndex] >= minValue)
23                         {
24                             inputArray[highIndex] = inputArray[lowIndex];
25                             break;
26                         }
27                     }
28                 }
29             }
30             inputArray[lowIndex] = minValue;
31             return lowIndex;
32         }

 

快排非递归实现:

 1         static void Main(string[] args)
 2         {
 3             int[] array = new int[] { 2,3,9,1,8,6};
 4             Stack<int> stack = new Stack<int>();
 5             stack.Push(0);
 6             stack.Push(array.Length - 1);
 7             while (stack.Count > 0)
 8             {
 9                 int low = stack.Pop();
10                 int high = stack.Pop();
11                 if (low > high)
12                 {
13                     low = low + high;
14                     high = low - high;
15                     low = low - high;
16                 }
17                 QuickSort(array, low, high, stack);
18             }
19         }
20 
21         internal static void QuickSort(int[] inputArray, int lowIndex, int highIndex, Stack<int> stack)
22         {
23             int low = lowIndex;
24             int high = highIndex;
25             int minValue = inputArray[lowIndex];
26             while (high > low)
27             {
28                 while (low < high && minValue <= inputArray[high])
29                 {
30                     high--;
31                 }
32                 if (high > low)
33                 {
34                     inputArray[low] = inputArray[high];
35                 }
36                 while (low < high && minValue >= inputArray[low])
37                 {
38                     low++;
39                 }
40                 if (high > low)
41                 {
42                     inputArray[high] = inputArray[low];
43                 }
44 
45                 if (low == high)
46                 {
47                     inputArray[low] = minValue;
48                     if (lowIndex < low - 1)
49                     {
50                         stack.Push(lowIndex);
51                         stack.Push(low -1);
52                     }
53                     if (highIndex > low + 1)
54                     {
55                         stack.Push(low + 1);
56                         stack.Push(highIndex);
57                     }
58                 }
59             }
60         }

 

快排是一种不稳定的排序。快排的最差时间复杂度是o(n2),理想时间复杂度是o(nlogn)。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
白话C++系列(18)--继承方式、隐藏发布时间:2022-07-14
下一篇:
(教学思路C#集合一)集合的概述、动态数组ArrayList发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap