直接插入排序概念:
带排元素放在elem[0...n-1]中,初始化时,elem[0]自成1个有序区,无序区为elem[1...n-1],从i=1起,到i=n-1,依次将elem[i]插入有序区[0...n-1]中
直接插入排序算法步骤:
1.在当前有序区域R[1,i-1]中查找R[i]的正确插入位置K(1<=K<=i-1)
2.将R[K,i-1]中的记录均向后移动
3.移动后腾出K位置,插入R[i]
(最坏)时间复杂度:O(n^2)
空间复杂度:O(1)
/// <summary> /// 步骤:(正序) /// 1.从带排序列中获取待排元素,记录 /// 2.依次比较有序集合中的各个元素(从有序集合中的最后一个开始向前比较) /// 3.如果待插入元素小与比较元素,则比较元素向后移动一个位置 /// 3.否则结束内层循环,此时的下标j+1则为待排元素的位置 /// /// 关键点: /// 1.第一个元素被当做是有序序列,故从i=1开始排序 /// 2.待排元素与有序元素的比较是从有序序列的最后一个元素开始比 /// 3.在有序序列中,一旦遇到比等排元素小的,则本次比较即为停止,j+1就是待排元素位置 /// /// [0][1][2][3][4][5][6] /// /// 88 16 8 27 24 49 78 /// /// 88 16 8 27 24 49 78 /// /// 16 88 8 27 24 49 78 /// /// 8 16 88 27 24 49 78 /// /// 8 16 27 88 24 49 78 /// /// 8 16 24 27 88 48 78 /// /// 8 16 24 27 48 88 78 /// /// 8 16 24 27 49 78 88 /// </summary> /// <param name="elements"></param> static void InsertSort(int[] elements) { int i; int j; for (i = 1; i < elements.Length; i++) { //记录需要插入的数据(带排元素) int standBy = elements[i]; // 内层循环是遍历有序序列 // 从有序序列中的最后一个开始比较 for (j = i - 1; j >= 0; j--) { // 如果待排元素比有序元素小,则向后移动 if (standBy < elements[j]) elements[j + 1] = elements[j]; else // 一旦条件不成立,则视为找到目标位置 break; } elements[j + 1] = standBy; } }
static void Main(string[] args) { int[] elements = { 88, 68, 25, 6, 12, 57, 78, 12 }; // 调用直接插入排序 InsertSort(elements); foreach(int e in elements) { Console.Write( e + " "); } }