手写插入排序算法

Posted 实力程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写插入排序算法相关的知识,希望对你有一定的参考价值。

今天给大家介绍插入排序算法,并且给出源码实现。


插入排序算法的思想是,对于一个包含N个未排序元素的数组,我们可以从位置1开始,通过比较元素1和元素0,把元素1插入到元素0的前面或者后面,实现这两个元素的有序排列。

然后再取元素2,这个元素前面的序列都已经是有序的了,因此只要找到元素2在前面序列中的位置,进行插入,那么元素0至元素2就都排好序了。

再取元素3,向前面有序序列进行插入,依次进行,一直到最后一个N-1元素插入完成,这样整个数组就都排好序了。


因此,插入算法的核心步骤是查找和插入。

查找,可以通过遍历比较,也可以通过二分法进行查找。

插入,对于内存位置连续的数组,可以直接用memmove, 内存位置不连续的只能逐个元素进行位置交换。



插入排序算法的思路比较容易理解,用C语言的代码实现如下:


void insert_sort(int* parr, int count) { for (int i = 1; i < count; i++) { int val = parr[i]; int pos = get_insert_pos(parr, i, val); if (pos != i) { memmove(parr + pos + 1, parr + pos, (i - pos) * sizeof(int)); parr[pos] = val; } }}



用遍历方式实现的 get_insert_pos() 函数,如下:

static int get_insert_pos(int* parr, int count, int val) { for (int i = 0; i < count; i++) { if (parr[i] > val) { // the first bigger item return i; } }

return count; // val is the biggest one}



更快的方式,是用二分法进行查找,代码如下:

static int get_insert_pos(int* parr, int count, int val) { int low = 0; int high = count - 1; while (low < high) { int mid = (low + high) / 2; if (parr[mid] > val) { high = mid - 1; } else { low = mid + 1; } }

return parr[low] > val ? low : low + 1;}





以上是关于手写插入排序算法的主要内容,如果未能解决你的问题,请参考以下文章

手写算法:插入排序

算法(插入排序----手写5种方法)

请用Python手写实现插入排序

面试官:手写一个希尔排序,并对其改进

面试必备用Python手写十大经典排序算法

面试官:手写一个插入排序,并对其改进