购物类网站建设方案,wordpress 百度云加速,免费网页游戏手机版,国外工会网站建设通俗易懂点的话#xff0c;就叫“双向冒泡排序”。 冒泡是一个单向的从小到大或者从大到小的交换排序#xff0c;而鸡尾酒排序是双向的#xff0c;从一端进行从小到大排序#xff0c;从另一端进行从大到小排序。 从图中可以看到#xff0c;第一次正向比较#xff0c;我们…通俗易懂点的话就叫“双向冒泡排序”。 冒泡是一个单向的从小到大或者从大到小的交换排序而鸡尾酒排序是双向的从一端进行从小到大排序从另一端进行从大到小排序。 从图中可以看到第一次正向比较我们找到了最大值 9. 第一次反向比较我们找到了最小值1. 第二次正向比较我们找到了次大值8. 第二次反向比较我们找到了次小值2 …… 最后就大功告成了。 下面我们看看代码 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml.Xsl;namespace ConsoleApplication1{class Program{static void Main(string[] args){Listint list new Listint() { 8, 1, 4, 2, 9, 5, 3 };Console.WriteLine(\n排序前 {0}\n, string.Join(,, list));list CockTailSort(list);Console.WriteLine(\n排序后 {0}\n, string.Join(,, list));Console.Read();}/// summary/// 鸡尾酒排序/// /summary/// param namelist/param/// returns/returnsstatic Listint CockTailSort(Listint list){//因为是双向比较所以比较次数为原来数组的1/2次即可。for (int i 1; i list.Count / 2; i){//从前到后的排序 (升序)for (int m i - 1; m list.Count - i; m){//如果前面大于后面则进行交换if (m 1 list.Count list[m] list[m 1]){var temp list[m];list[m] list[m 1];list[m 1] temp;}}Console.WriteLine(正向排序 {0}, string.Join(,, list));//从后到前的排序降序for (int n list.Count - i - 1; n i; n--){//如果前面大于后面则进行交换if (n 0 list[n - 1] list[n]){var temp list[n];list[n] list[n - 1];list[n - 1] temp;}}Console.WriteLine(反向排序 {0}, string.Join(,, list));}return list;}}}从结果上面看我们会发现当数组有序的时候我们还会继续往下排知道完成 length/2 次这个就跟没优化之前的冒泡排序一样此时我们可以加上一个标志位 IsSorted 来判断是否已经没有交换了如果没有提前退出循环。 /// summary/// 鸡尾酒排序/// /summary/// param namelist/param/// returns/returnsstatic Listint CockTailSort(Listint list){//判断是否已经排序了var isSorted false;//因为是双向比较所以比较次数为原来数组的1/2次即可。for (int i 1; i list.Count / 2; i){//从前到后的排序 (升序)for (int m i - 1; m list.Count - i; m){//如果前面大于后面则进行交换if (m 1 list.Count list[m] list[m 1]){var temp list[m];list[m] list[m 1];list[m 1] temp;isSorted true;}}Console.WriteLine(正向排序 {0}, string.Join(,, list));//从后到前的排序降序for (int n list.Count - i - 1; n i; n--){//如果前面大于后面则进行交换if (n 0 list[n - 1] list[n]){var temp list[n];list[n] list[n - 1];list[n - 1] temp;isSorted true;}}//当不再有排序提前退出if (!isSorted)break;Console.WriteLine(反向排序 {0}, string.Join(,, list));}return list;}