數據結構--排序之重溫

1、冒泡排序

         定義:冒泡排序是一種交換排序,他的基本思想是:兩兩比較相鄰記錄的數,如果反序則交換,直到沒有反序的記錄爲止。

/// <summary>
        /// 改進冒泡算法
         /// </summary>
        /// <param name="nums"></param>
        /// <returns></returns>
        static void BubbleSort(int[] nums)
        {
            bool flag = true;

            // 第一層:比較趟數(n-1)
            for (int i = 0; i < nums.Length -1 && flag ; i++)   /* 若flag爲false,退出循環,排序結束 */
            {
                flag = false;                                   /* 排序前,重置爲false */

                // 第二層:兩兩相鄰比較,交換排序
                for (int j = nums.Length - 1; j > i; j--)
                {
                    // 小數向前排(一趟交換多次)
                    if (nums[j] < nums[j - 1])
                    {
                        int temp = nums[j];

                        nums[j] = nums[j - 1];

                        nums[j - 1] = temp;

                        flag = true;                            /* 如果有數據交換,標識爲true, 繼續排序*/
                    }
                }

                //Console.Write((i + 1) + "趟" + " ");
            }

            //Console.WriteLine();
        }

 

2、選擇排序

       思想:將序列劃分爲無序和有序兩個子序列,尋找無序序列中的最小(大)值和無序序列的首元素交換,有序區擴大一個,循環下去,最終完成全部排序。

/// <summary>
        /// 選擇排序(相比冒泡優在減少了交換次數,總體性能優於冒泡)
         /// </summary>
        /// <param name="nums"></param>
        /// <returns></returns>
        static void SelectSort(int[] nums)
        {
            int min = 0;

            // 第一層:選擇趟數(n-1)
            for (int i = 0; i < nums.Length - 1; i++)
            {
                min = i;                                        /* 將當前下標定義爲最小值下標 */

                // 第二層:選出最小值下標
                for (int j = i + 1; j < nums.Length; j++)
                {
                    if (nums[j] < nums[min])                    /* 如果有小於當前最小值 */
                    {
                        min = j;                                /* 更換最小值下標 */
                    }
                }

                // 交換數據(一趟只交換一次)
                if (min != i)
                {
                    int temp = nums[i];

                    nums[i] = nums[min];

                    nums[min] = temp;
                }
            }
        }


3、插入排序 

概念:將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據(假設一個key,通過不斷的比較而形成一個有序的數列)。

/// <summary>
        /// 插入排序(不適合對於數據量比較大的排序應用,一般用於少量元素的排序)
        /// </summary>
        /// <param name="nums"></param>
        /// <returns></returns>
        static void InsertSort(int[] nums)
        {
            for (int i = 1; i < nums.Length; i++)                   /* 在插入排序中,可以先跳過第一個元素,從第二個元素開始 */
            {
                int temp = nums[i];                                 /* 要插入的值 */

                int j = i;                                          /* 有序序列數組元素數 */

                while (j > 0 && nums[j - 1] > temp)                 /* 與有序序列比較,如果有序序列_當前索引_值大於要插入的值,有序序別後移 */
                {
                    nums[j] = nums[j - 1];                          /* 交換數據,後移 */

                    j--;
                }

                nums[j] = temp;                                     /* 插入當前位置 */
            }
        }

待繼...

發佈了120 篇原創文章 · 獲贊 9 · 訪問量 57萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章