zoukankan      html  css  js  c++  java
  • 烙饼排序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/

     
  • 相关阅读:
    void类型和void *指针类型(网上摘抄总结)【转】
    微信小程序中的canvas基础应用
    Google Interview University 一套完整的学习手册帮助自己准备 Google 的面试
    git使用教程(详细)
    Vue下载依赖遇到的一些bug
    原生Javascript客户端表单验证
    ASP MVC 后台控制器弹出框提示
    网页URLJs传值传值传值传值传值问题
    从零开始,搭建博客系统MVC5+EF6搭建框架(1),EF Code frist、实现泛型数据仓储以及业务逻辑
    弹出提示框,在跳转
  • 原文地址:https://www.cnblogs.com/haowuji/p/2840784.html
Copyright © 2011-2022 走看看