【數據結構】【C#】013-插入類排序:??直接插入排序(穩定)

插入排序:直接插入排序(穩定)

【 算法思想 】 直接插入排序是一種最基本的插入排序方法,其基本操作是將第 i 個記錄插入到前面 i-1 個已排好序的記錄中。具體過程為:將第 i 個記錄的關鍵字 K i ,順次與其前面記錄的關鍵字 K i-1 ,K i-2 ,…, K 1 進行比較,將所有關鍵字大于 K i 的記錄依次向后移動一個位置,直到遇見一個關鍵字小于或者等于 K i 的記錄 K j ,此時 K j 后面必為空位置,將第 i 個記
錄插入空位置即可。完整的直接插入排序是從 i=2 開始,也就是說,將第 1 個記錄視為已排好序的單元素子集合,然后將第二個記錄插入到單元素子集合中。i 從 2 循環到 n,即可實現完整的直接插入排序。

我們經常會到這樣一類排序問題:把新的數據插入到已經排好的數據列中。將第一個數和第二個數排序,然后構成一個有序序列將第三個數插入進去,構成一個新的有序序列。對第四個數、第五個數……直到最后一個數,重復第二步。如題所示:

來自網絡

直接插入排序(Straight Insertion Sorting)的基本思想:在要排序的一組數中,假設前面(n-1) [n>=2] 個數已經是排好順序的,現在要把第n個數插到前面的有序數中,使得這n個數也是排好順序的。如此反復循環,直到全部排好順序。


C#實現:

/// <summary>
/// 自定義工具類
/// </summary>
public static class Utilit
{
    /// <summary>
    /// 輔助輸出排序結果:
    /// </summary>
    /// <param name="a"></param>
    /// <param name="t"></param>
    public static void Print(int[] a, int t)
    {
        string str = null;
        for (int i = 0; i < a.Length; i++)
        {
            str += a[i].ToString() + " ";
        }
        Debug.Log("第" + t + "趟排序結果:" + str);
    }

    /// <summary>
    /// 輔助生成排序結果
    /// </summary>
    /// <param name="max"></param>
    /// <param name="length"></param>
    /// <returns></returns>
    public static int[] RandArray(int max, int length)
    {
        string str = null;
        int[] a = new int[length];
        for (int i = 0; i < a.Length; ++i)
        {
            a[i] = Random.Range(0, max);
            str += a[i].ToString() + " ";
        }
        Debug.Log("隨機生成的數組:" + str);
        return a;
    }
}

上方為產生隨機數組與打印排序數組的工具類

直接插入排序:


/// <summary>
/// 插入排序類
/// </summary>
public class InsertSort
{
    /// <summary>
    ///1、 直接插入排序法:
    /// </summary>
    /// <param name="a"></param>
    public static void StraightInsetSort(int[] a)
    {
        int insertNum;//要插入的數
        int len = a.Length;//數組長度

        for (int i = 1; i < len; i++) //從第2個數,進行插入排序
        {
            insertNum = a[i];

            int j = i - 1; //前一個數的索性值

            while (j >= 0 && insertNum < a[j])
            {
                a[j + 1] = a[j]; //把大的向后移動
                j--;
            }

            a[j + 1] = insertNum;//找到位置,插入當前元素

            Utilit.Print(a, i);//輸出每趟的排序的結果
        }

    }

}

測試用例:

public class _012_InsertSort : MonoBehaviour
{


    void Start()
    {
        int[] a = Utilit.RandArray(20, 10); //max,lenght

        Debug.Log("------------直接插入排序----------------");
        InsertSort.StraightInsetSort(a); //直接插入排序

    }
}

輸出結果:

插入排序:直接插入排序

注:

1、直接插入排序的時間復雜度為 T(n)=O(n 2 ),空間復雜度為 S(n)=O(1)。

2、穩定排序算法

3、直接插入排序算法簡便,比較適用于待排序記錄數目較少基本有序的情況。當待排記錄數目較大時,直接插入排序的性能就不好,因此可以對直接插入排序做進一步的改進。在直接插入排序法的基礎上,從減少“比較關鍵字”“移動記錄”兩種操作的次數著手來進行改進。

image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。