基于C#实现鸡尾酒排序(双向冒泡排序)

通俗易懂点的话,就叫"双向冒泡排序"。

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

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

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

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

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

......

最后就大功告成了。
下面我们看看代码:

csharp 复制代码
 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)
         {
             List<int> list = new List<int>() { 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 name="list"></param>
         /// <returns></returns>
         static List<int> CockTailSort(List<int> 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 来判断是否已经没有交换了,如果没有,提前退出循环。

csharp 复制代码
 /// <summary>
 /// 鸡尾酒排序
 /// </summary>
 /// <param name="list"></param>
 /// <returns></returns>
 static List<int> CockTailSort(List<int> 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;
 }
相关推荐
有梦想的攻城狮11 分钟前
Java 11中的Collections类详解
java·windows·python·java11·collections
忒可君16 分钟前
C# winform FTP功能
开发语言·windows·c#
黑客影儿1 小时前
Java技术总监的成长之路(技术干货分享)
java·jvm·后端·程序人生·spring·tomcat·maven
十五年专注C++开发1 小时前
CMake进阶: CMake Modules---简化CMake配置的利器
linux·c++·windows·cmake·自动化构建
degree5201 小时前
全平台轻量浏览器推荐|支持Win/macOS/Linux,极速加载+隐私保护+扩展插件,告别广告与数据追踪!
windows·macos·电脑
没有bug.的程序员2 小时前
JVM 运行时数据区详解:内存模型与对象生命周期全景解析
java·jvm·运行时数据区·内存模型·对象生命周期
时光追逐者2 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 50 期(2025年8.11-8.17)
c#·.net·.netcore·.net core
一个会的不多的人3 小时前
C# NX二次开发:操作按钮控件Button和标签控件Label详解
开发语言·c#
咕白m6253 小时前
C# 实现 PDF 转图片 - 分辨率设置、图片格式选择
后端·c#
与火星的孩子对话5 小时前
Unity高级开发:反射原理深入解析与实践指南 C#
java·unity·c#·游戏引擎·lucene·反射