首页 > 代码库 > 鸡尾酒排序Cocktail sort

鸡尾酒排序Cocktail sort

鸡尾酒排序基于冒泡排序,双向循环

还是看例子吧,给定待排数组[2 3 4 5 1]

第一趟过去时的每一步

第一步迭代,2 < 3不换

[2 3 4 5 1]

 

第二步迭代,3 < 4不换

[2 3 4 5 1]

 

第三步迭代,4 < 5不换

[2 3 4 5 1]

 

第四步迭代,5 > 1交换

[2 3 4 1 5]

 

第一趟回来时的第一步,鸡尾酒一次到头后就回返回来,再到头后再过去,来回比,一个来回能排两个数字

第五步迭代,1 < 5不交换

[2 3 4 1 5]

 

第六步迭代,1 < 4交换

[2 3 1 4 5]

 

第七步迭代,1 < 3交换

[2 1 3 4 5]

 

第八步迭代,2 > 1交换

[1 2 3 4 5]

 

排序完毕,顺序输出结果即可得[ 1 2 3 4 5]

 

如何判断排序结束了?

假如一趟来回没有交换任何数字,则表示该数组已经有序了,可以设置了个变量表示有没有交换过

static void cocktail_sort(int[] unsorted)
        {
            bool swapped = false;
            do
            {
                for (int i = 0; i < unsorted.Length - 1; i++)
                {
                    if (unsorted[i] > unsorted[i + 1])
                    {
                        int temp = unsorted[i];
                        unsorted[i] = unsorted[i + 1];
                        unsorted[i + 1] = temp;
                        swapped = true;
                    }
                }

                swapped = false;
                for (int j = unsorted.Length; j > 1; j--)
                {
                    if (unsorted[j] < unsorted[j - 1])
                    {
                        int temp = unsorted[j];
                        unsorted[j] = unsorted[j - 1];
                        unsorted[j - 1] = temp;
                        swapped = true;
                    }
                }
            } while (swapped);
        }


        static void Main(string[] args)
        {
            int[] x = { 6, 2, 4, 1, 5, 9 };
            selection_sort(x);
            foreach (var item in x)
            {
                Console.WriteLine(item);
            }
            Console.ReadLine();
        }

  

鸡尾酒排序Cocktail sort