烙饼排序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