烙饼排序2(比较高效率的方法)

这个比上一个效率要高一些,但不是最高的,下面图片是用这个方法 计算出3216549870 这个数列的翻转顺序。

 List<int> intList = new List<int>();
        public frm_BingBaiXu()
        {
            InitializeComponent();
            textBox1.Text = "3216549870";
        }

        #region 输出信息
        /// <summary>
        /// 输出信息
        /// </summary>
        private void ExportInfo()
        {
            string str;
            str = "";
            for (int j = 0; j < intList.Count; j++)
            {
                str += intList[j] + "-";
            }
            listBox1.Items.Add(listBox1.Items.Count.ToString() + ":" + str);
        }
        #endregion

        #region 初始化信息
        /// <summary>
        /// 初始化信息
        /// </summary>
        private void InitInfo()
        {
            intList.Clear();
            for (int i = 0; i < textBox1.Text.Length; i++)
            {
                intList.Add(Convert.ToInt16(textBox1.Text.Substring(i, 1)));
            }
            listBox1.Items.Clear();
        }
        #endregion

        #region 高效率计算
        /// <summary>
        /// 高效率计算
        /// 思路是:  (3216549870)
        /// 1.先找出最大的数  (9)
        /// 2.看它的下个一个数是否和它相邻(看9后面是不是8)
        /// 3.不断的找(看8后面是不是7,看7后面是不是6)
        /// 4.直到找出不相邻的(发现7后面不是6)
        /// 5.找到最后一个不与其相邻的数的索引(得到7的索引)
        /// 6.然后翻转(翻转后7894561230)
        /// 7.如果是存在相邻的,那么再次把这个数翻转。(再次翻转:9874561230)
        /// 8.再次把所有数据翻转(0321654789)
        /// 9.构建一个循环
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnJSGXL_Click(object sender, EventArgs e)
        {
            InitInfo();
            bool isUpdate = false;
            ExportInfo();
            for (int i = 0; i < intList.Count; i++)
            {
                int maxNum = intList[0];
                int index = 0;
                int index2 = 0;
                //找到最大的数
                for (int j = 0; j < intList.Count - i; j++)
                {
                    if (maxNum < intList[j])
                    {
                        maxNum = intList[j];
                        index = j;
                    }
                }
                index2 = index;
                bool IsExistNear = false;
                for (int j = index; j < intList.Count; j++)
                {
                    //看下一个数是不是与这个数相邻
                    if (IsNear(index))
                    {
                        IsExistNear = true;
                        index++;
                    }
                    else
                    {
                        break;
                    }
                }
                //说明该数的位置不在未排序好中的最后一个
                if (index2 != intList.Count - i - 1)
                {
                    if (index2 != 0)//说明不是第一个
                    {
                        isUpdate = false;
                        for (int j = 0; j < (index + 1) / 2; j++)
                        {
                            int temp;
                            temp = intList[j];
                            intList[j] = intList[index - j];
                            intList[index - j] = temp;
                            isUpdate = true;
                        }
                        if (isUpdate)
                        {
                            ExportInfo();
                        }
                    }
                    isUpdate = false;
                    //如果存在相邻的那么要把这个翻转一下
                    if (IsExistNear)
                    {
                        int Indexs = index - index2 + 1;
                        for (int j = 0; j < Indexs / 2; j++)
                        {
                            int temp;
                            temp = intList[j];
                            intList[j] = intList[Indexs - j - 1];
                            intList[Indexs - j - 1] = temp;
                            isUpdate = true;
                        }
                        if (isUpdate)
                        {
                            ExportInfo();
                        }
                    }
                    //上面已经翻转过不用再次翻转了
                    if (IsExistNear && intList.Count - i == index - index2 + 1)
                        continue;
                    //再次把数组翻转
                    for (int j = 0; j < (intList.Count - i) / 2; j++)
                    {
                        int temp;
                        temp = intList[j];
                        intList[j] = intList[intList.Count - i - j - 1];
                        intList[intList.Count - i - j - 1] = temp;
                        isUpdate = true;
                    }
                    if (isUpdate)
                    {
                        ExportInfo();
                    }
                }
            }
        }
        #endregion

        #region 是否与它后面的那个元素师相邻的
        /// <summary>
        /// 是否与它后面的那个元素师相邻的
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        private bool IsNear(int index)
        {
            if (index != intList.Count - 1)
            {
                if (intList[index] - intList[index + 1] == 1)
                {
                    return true;
                }
            }
            return false;
        }
        #endregion

 

-----------------------------

天王盖地虎小说网:http://www.twgdh.com/

 

 
posted @ 2012-12-31 16:44  下-个路口  阅读(560)  评论(0编辑  收藏  举报