插入排序:直接插入排序(穩定)
【 算法思想 】 直接插入排序是一種最基本的插入排序方法,其基本操作是將第 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