十大經典排序算法之插入排序

插入排序

**說起排序算法,最先要說的就是插入排序。**因爲它簡單且穩定。

那麼什麼是插入排序呢?

例如:

  • 有一組數據已經有序(不論升序降序)的排列好了,這時候我們需要在這組數據中再插入一個數據,並且要求該組數據依然有序,那麼這個時候我們就可以使用插入排序算法解決問題。
  • 算法思想(我們以數組的操作舉例(升序)):
    1.首先,包含兩個以上元素的數組才需要排序。所以我們就從數組的第二個元素開始。
    2.將我們選擇出來的元素與它左邊的元素依次比較,如果左邊第一個元素比它大,則比較左邊第二個,直到遇到比他小的,就插到這個元素的右邊。
    3.然後就這樣往後選取元素重複上面的步驟。
  • 當然,如果你看上面的文字覺得乾巴巴的有點晦澀,看不懂是個什麼玩意兒。博主還爲你準備了下面的代碼示例,希望兩者對比着看可以對你有所幫助。
    代碼示例如下(C#實現):

			//定義一個整型數組
            int[] arr01 = new int[] { 5, 6, 4, 1, 3, 8, 9, 0, 2, 7 };

            //第一種方式
            //我們定義一個變量temp用來交換值
            int temp01;

            //從角標1也就是第二個元素開始
            for (int i = 1; i < arr01.Length; i++)
            {
                //將我們選擇出來的元素與它左邊的元素依次比較
                for (int j = i; j > 0; j--)
                {
                    //滿足條件就交換兩數位置
                    if (arr01[j] < arr01[j - 1]) 
                    {
                        temp01 = arr01[j];
                        arr01[j] = arr01[j - 1];
                        arr01[j - 1] = temp01;
                    }
                }
            }

            //打印看看是否正確
            Console.WriteLine("排序後的數組爲:");
            for (int i = 0; i < arr01.Length; i++)
            {
                Console.Write(arr01[i] + " ");
            }
            

好,上面這種方法能夠實現我們的插入排序,可是我們可以看到,每次判斷爲真之後都要進行兩數交換,這一操作過於頻繁。下面我們就針對這裏進行優化,請看第二種實現方法:

代碼示例如下(C#實現):


			//定義一個整型數組
            int[] arr01 = new int[] { 5, 6, 4, 1, 3, 8, 9, 0, 2, 7 };

            //第二種方式

            //從角標1也就是第二個元素開始
            for (int i = 1; i < arr01.Length; i++)
            {
                //進入第一層循環,我們先定義兩個變量temp,index
                //temp用來保存我們選擇進行插入排序的元素的值
                //index用來保存要插入的角標位置
                int temp = arr01[i];
                int index = i;

                //將我們選擇出來的元素與它左邊的元素依次比較
                for (int j = i; j > 0; j--)
                {
                    //滿足條件就先變更角標和後移比較過的元素的值
                    if (temp < arr01[j - 1]) 
                    {
                        arr01[j] = arr01[j - 1];
                        index = j-1;
                    }
                }

                //在合適的位置插入我們選擇的值
                arr01[index] = temp;

            }

            //打印看看是否正確
            Console.WriteLine("排序後的數組爲:");
            for (int i = 0; i < arr01.Length; i++)
            {
                Console.Write(arr01[i] + " ");
            }

好啦,上面這個就是優化版本了,可以看到我們省去了很多次交換的步驟,優化了代碼。

插入排序算法就說到這裏,有疑問的可以私聊博主。
點個關注,給個讚唄!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章