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

要是文艺点的话,可以说是搅拌排序,通俗易懂点的话,就叫“双向冒泡排序”,我想作为码农的话,不可能不知道冒泡排序,
冒泡是一个单向的从小到大或者从大到小的交换排序,而鸡尾酒排序是双向的,从一端进行从小到大排序,从另一端进行从大
到小排序。

从图中可以看到,第一次正向比较,我们找到了最大值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 Program10 {11 static void Main(string[] args)12 {13 List list = new List() { 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 /// 25 /// 鸡尾酒排序26 /// 27 /// 28 /// 29 static List CockTailSort(List list)30 {31 //因为是双向比较,所以比较次数为原来数组的1/2次即可。32 for (int i = 1; i 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[n])55 {56 var temp = list[n];57 58 list[n] = 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 ///2 /// 鸡尾酒排序 3 /// 4 /// 5 ///6 static List CockTailSort(List list) 7 { 8 //判断是否已经排序了 9 var isSorted = false;10 11 //因为是双向比较,所以比较次数为原来数组的1/2次即可。12 for (int i = 1; i 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[n])37 {38 var temp = list[n];39 40 list[n] = 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 }

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/2144/viewspace-2811508/ ,如需转载,请注明出处,否则将追究法律责任。