维基百科上的算法描述:
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置中
- 重复步骤2
如果比较操作的代价比交换操作大的话,可以采用二分法来减少比较操作的数目。
自己的理解:
说实话,学过数据结构的同学们应该都对在一个线性链表中插入一个元素不陌生吧,至少考试数据结构的时候这个可是必出题。
如果想在一个链表中插入一个元素的话就是把所插入元素之后的所有元素全部向后移动一位。而这个插入算法也和在聊表中插入一
个元素有异曲同工之妙。
首先和上一节的冒泡排序一样,取出每一个元素(我们把它记作A),让我们用已经拍过序的序列的元素倒着和这个元素比较,
如果大于这个元素A的话,将排过序的这个元素向后移动一位,其他已排过序的元素做同样的操作(即比较后,如果大于A的话,
向后移一位),这样就把A的位置给让出来了,最后如果没有在大于A的时候,这个位置就是A的位置。
插入排序的时间复杂度为O(n2)
呵呵,很简单吧
public static void InsertSort(int[] array)
{
for (int i = 0; i < array.Length; i++)
{
int temp = array[i];
int counter = i;
while (counter > 0 && (array[counter - 1] > temp))
{
array[counter] = array[counter - 1];
counter--;
}
array[counter] = temp;
}
}
{
for (int i = 0; i < array.Length; i++)
{
int temp = array[i];
int counter = i;
while (counter > 0 && (array[counter - 1] > temp))
{
array[counter] = array[counter - 1];
counter--;
}
array[counter] = temp;
}
}