数据结构与算法专题——第九题 鸡尾酒排序
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法专题——第九题 鸡尾酒排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這篇我們來聊一下雞尾酒排序,為了知道為啥取名為雞尾酒,特意看了下百科,見框框的話,也只能勉強這么說了。
要是文藝點的話,可以說是攪拌排序,通俗易懂點的話,就叫“雙向冒泡排序”,我想作為碼農的話,不可能不知道冒泡排序,冒泡是一個單向的從小到大或者從大到小的交換排序,而雞尾酒排序是雙向的,從一端進行從小到大排序,從另一端進行從大到小排序。
從圖中可以看到:
第一次正向比較,我們找到了最大值 9.
第一次反向比較,我們找到了最小值 1.
第二次正向比較,我們找到了次大值 8.
第二次反向比較,我們找到了次小值 2
。。。
最后就大功告成了。
下面我們看看代碼:
namespace ConsoleApplication1 {class Program{static void Main(string[] args){List<int> list = new List<int>() { 8, 1, 4, 2, 9, 5, 3 };Console.WriteLine("\n排序前 => {0}\n", string.Join(",", list));list = CockTailSort(list);Console.WriteLine("\n排序后 => {0}\n", string.Join(",", list));Console.Read();}/// <summary>/// 雞尾酒排序/// </summary>/// <param name="list"></param>/// <returns></returns>static List<int> CockTailSort(List<int> list){//因為是雙向比較,所以比較次數為原來數組的1/2次即可。for (int i = 1; i <= list.Count / 2; i++){//從前到后的排序 (升序)for (int m = i - 1; m <= list.Count - i; m++){//如果前面大于后面,則進行交換if (m + 1 < list.Count && list[m] > list[m + 1]){var temp = list[m];list[m] = list[m + 1];list[m + 1] = temp;}}Console.WriteLine("正向排序 => {0}", string.Join(",", list));//從后到前的排序(降序)for (int n = list.Count - i - 1; n >= i; n--){//如果前面大于后面,則進行交換if (n > 0 && list[n - 1] > list[n]){var temp = list[n];list[n] = list[n - 1];list[n - 1] = temp;}}Console.WriteLine("反向排序 => {0}", string.Join(",", list));}return list;}} }從結果上面看,我們會發現,當數組有序的時候,我們還會繼續往下排,直到完成?length/2?次,這個就跟沒優化之前的冒泡排序一樣,此時我們可以加上一個標志位IsSorted 來判斷是否已經沒有交換了,如果沒有,提前退出循環。。。
/// <summary>/// 雞尾酒排序/// </summary>/// <param name="list"></param>/// <returns></returns>static List<int> CockTailSort(List<int> list){//判斷是否已經排序了var isSorted = false;//因為是雙向比較,所以比較次數為原來數組的1/2次即可。for (int i = 1; i <= list.Count / 2; i++){//從前到后的排序 (升序)for (int m = i - 1; m <= list.Count - i; m++){//如果前面大于后面,則進行交換if (m + 1 < list.Count && list[m] > list[m + 1]){var temp = list[m];list[m] = list[m + 1];list[m + 1] = temp;isSorted = true;}}Console.WriteLine("正向排序 => {0}", string.Join(",", list));//從后到前的排序(降序)for (int n = list.Count - i - 1; n >= i; n--){//如果前面大于后面,則進行交換if (n > 0 && list[n - 1] > list[n]){var temp = list[n];list[n] = list[n - 1];list[n - 1] = temp;isSorted = true;}}//當不再有排序,提前退出if (!isSorted)break;Console.WriteLine("反向排序 => {0}", string.Join(",", list));}return list;}好了,這樣就比較完美了,希望本篇對您有幫助。
總結
以上是生活随笔為你收集整理的数据结构与算法专题——第九题 鸡尾酒排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Ids4实战】分模块保护资源API
- 下一篇: C#高级技师语法,你会吗?