您的位置:首页 > 其它

经典算法题每日演练——第二十三题 鸡尾酒排序

2017-03-22 17:07 162 查看
 
 

  这篇我们继续扯淡一下鸡尾酒排序,为了知道为啥取名为鸡尾酒,特意看了下百科,见框框的话,也只能勉强这么说了。



 

要是文艺点的话,可以说是搅拌排序,通俗易懂点的话,就叫“双向冒泡排序”,我想作为码农的话,不可能不知道冒泡排序,

冒泡是一个单向的从小到大或者从大到小的交换排序,而鸡尾酒排序是双向的,从一端进行从小到大排序,从另一端进行从大

到小排序。



从图中可以看到,第一次正向比较,我们找到了最大值9. 

                      第一次反向比较,我们找到了最小值1.

                      第二次正向比较,我们找到了次大值8.

                      第二次反向比较,我们找到了次小值2

                      。。。

                     最后就大功告成了。

 

下面我们看看代码:

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Xml.Xsl;
6
7 namespace ConsoleApplication1
8 {
9     class Program
10     {
11         static void Main(string[] args)
12         {
13             List<int> list = new List<int>() { 8, 1, 4, 2, 9, 5, 3 };
14
15             Console.WriteLine("\n排序前 => {0}\n", string.Join(",", list));
16
17             list = CockTailSort(list);
18
19             Console.WriteLine("\n排序后 => {0}\n", string.Join(",", list));
20
21             Console.Read();
22         }
23
24         /// <summary>
25         /// 鸡尾酒排序
26         /// </summary>
27         /// <param name="list"></param>
28         /// <returns></returns>
29         static List<int> CockTailSort(List<int> list)
30         {
31             //因为是双向比较,所以比较次数为原来数组的1/2次即可。
32             for (int i = 1; i <= list.Count / 2; i++)
33             {
34                 //从前到后的排序 (升序)
35                 for (int m = i - 1; m <= list.Count - i; m++)
36                 {
37                     //如果前面大于后面,则进行交换
38                     if (m + 1 < list.Count && list[m] > list[m + 1])
39                     {
40                         var temp = list[m];
41
42                         list[m] = list[m + 1];
43
44                         list[m + 1] = temp;
45                     }
46                 }
47
48                 Console.WriteLine("正向排序 => {0}", string.Join(",", list));
49
50                 //从后到前的排序(降序)
51                 for (int n = list.Count - i - 1; n >= i; n--)
52                 {
53                     //如果前面大于后面,则进行交换
54                     if (n > 0 && list[n - 1] > list
)
55                     {
56                         var temp = list
;
57
58                         list
= list[n - 1];
59
60                         list[n - 1] = temp;
61                     }
62                 }
63
64                 Console.WriteLine("反向排序 => {0}", string.Join(",", list));
65             }
66
67             return list;
68         }
69     }
70 }




 

从结果上面看,我们会发现,当数组有序的时候,我们还会继续往下排,知道完成length/2次,这个就跟没优化之前的冒泡排序一样,

此时我们可以加上一个标志位IsSorted来判断是否已经没有交换了,如果没有,提前退出循环。。。

1         /// <summary>
2         /// 鸡尾酒排序
3         /// </summary>
4         /// <param name="list"></param>
5         /// <returns></returns>
6         static List<int> CockTailSort(List<int> list)
7         {
8             //判断是否已经排序了
9             var isSorted = false;
10
11             //因为是双向比较,所以比较次数为原来数组的1/2次即可。
12             for (int i = 1; i <= list.Count / 2; i++)
13             {
14                 //从前到后的排序 (升序)
15                 for (int m = i - 1; m <= list.Count - i; m++)
16                 {
17                     //如果前面大于后面,则进行交换
18                     if (m + 1 < list.Count && list[m] > list[m + 1])
19                     {
20                         var temp = list[m];
21
22                         list[m] = list[m + 1];
23
24                         list[m + 1] = temp;
25
26                         isSorted = true;
27                     }
28                 }
29
30                 Console.WriteLine("正向排序 => {0}", string.Join(",", list));
31
32                 //从后到前的排序(降序)
33                 for (int n = list.Count - i - 1; n >= i; n--)
34                 {
35                     //如果前面大于后面,则进行交换
36                     if (n > 0 && list[n - 1] > list
)
37                     {
38                         var temp = list
;
39
40                         list
= list[n - 1];
41
42                         list[n - 1] = temp;
43
44                         isSorted = true;
45                     }
46                 }
47
48                 //当不再有排序,提前退出
49                 if (!isSorted)
50                     break;
51
52                 Console.WriteLine("反向排序 => {0}", string.Join(",", list));
53             }
54
55             return list;
56         }


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: