黑马程序员技术交流社区

标题: C#怎么用鸡尾酒排序 [打印本页]

作者: 孙亚雄    时间: 2012-8-16 15:17
标题: C#怎么用鸡尾酒排序
高手帮忙解释下有个代码注释就更好了,看百度还是有些迷糊 谢谢
作者: 许庭洲    时间: 2012-8-16 16:43
/*******************2012-08-15**************************/
/*******************In BeiJing***************************/
static void change(ref int left,ref int right)
{
       int temp;//临时变量;
       temp = left; //第一个值
       left = right;//第二个数的值赋给第一个数
       right = temp;//将第二个数的值赋给临时变量
}

static void CatchSorts(int[] intArray)//排序的数组
{
       int low,up,index;
       low = 0;//数组的开始索引
       up=intArray.Length - 1;//数组的结束索引
       while(up>low)
       {
            for(int i=low; i< up; i++)//从上到下扫描
             {
                 if(intArray[i+1]>intArray[i+1]))
                 {
                       change(ref intArray[i],ref intArray[i+1]);
                       index = i;//记录索引
                 }
             }
             up=index;
             for(int i=up;i>low;i--)//从下到上扫描
             {
                   if(intArray[i]<intArray[i-1])
                   {
                         change(ref intArray[i], ref intArray[i-1]);
                         index = i;
                   }
               }
                low = index;
        }
}

static void sort(int[] intArray)//定义一个需要排序的一维数组
{
       intArray = intAry;
       CatchSorts(intArray);//采用鸡尾酒经典算法排序
}

static void Main(string[] args)
{
      int[] ary = new int[] { 12,43,1,432,76,3};//手段定义一个数组,并赋值
  sort(ary);//排序
  for(int i=0;i<ary.Length;i++)
      {
            Console.WriteLine(ary[i]+"");//逐一输出
  }
      Console.ReadLine();
}
作者: 黑马杨凯    时间: 2012-8-16 17:12
本帖最后由 黑马杨凯 于 2012-8-16 17:18 编辑

        static void Main(string[] args)
        {
            int[] nums = new int[20];
            Random r = new Random();
            Console.WriteLine("原始数据:");
            for (int i = 0; i < nums.Length; i++)
            {
                nums = r.Next(100);
                Console.Write(nums + " ");
            }
            Console.WriteLine();


            int temp=0;//交换用空间
            int low = 0;//low负责更改正向冒泡的起点位置(也是反向冒泡的终点)
            int high = nums.Length-1;//high负责反向冒泡的起点位置(也是正向冒泡的终点)、
            bool isChanged = true;//记录是否发生了交换,如果没交换就为false,发生了交换设置为true,
                                  //作为判断提前完成排序任务情况的标记,以便及时终止程序

            //开始鸡尾酒排序
         while (true)
            {
                isChanged = false;//恢复标志位

                //先进行正向冒泡,大值到右边
                for (int i = low; i < high; i++)
                {
                    if (nums > nums[i + 1])
                    {
                        //nums大于nums[i+1],就交换位置,大的向后
                        temp = nums;
                        nums = nums[i + 1];
                        nums[i + 1] = temp;
                        isChanged = true;//发生交换就将标志置为true
                    }
                }
                //正向冒泡完成一轮,最后一个数据确定了,终点前移
                high--;

                if (isChanged == false)//判断是否进行了交换
                {
                    break;//不交换了就跳出循环
                }

                isChanged = false;//恢复标志位

                //然后再反向进行冒泡,小值到左边
                for (int j = high; j > low; j--)
                {
                    if (nums[j] < nums[j - 1])
                    {
                        //nums[j]小于nums[j-1],就交换位置,小的向左
                        temp = nums[j];
                        nums[j] = nums[j - 1];
                        nums[j - 1] = temp;
                        isChanged = true;
                    }
                }

                if (isChanged == false)
                {
                    break;//不交换了就跳出循环
                }
                //反向冒泡一轮结束,起始点向后移
                low++;
            }


            Console.WriteLine("最终结果:");
            for (int i = 0; i < nums.Length; i++)
            {
                Console.Write(nums+" ");
            }
            Console.WriteLine();

            Console.ReadKey();
        }
作者: 梁健1    时间: 2012-8-16 18:40
赞一个!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2