排序算法总结(二)插入排序

访问www.tomcoding.com网站,学习Oracle内部数据结构,详细文档说明,下载Oracle的exp/imp,DUL,logminer,ASM工具的源代码,学习高技术含量的内容。

插入排序是在一个有序集合中插入一个元素,插入后这个集合还是有序状态。如果一个数组本来是无序的,要用插入排序算法使之有序,这个过程就叫插入排序。这个算法要点在于要先有一个排过序的集合,如果把第一个元素看做是有序的,那么这个集合就有了,接下来就是在剩下的元素中遍历一次,把每个元素插入到前面的有序集合中。

如果数组的元素个数是n,我们看看在第i个元素插入时的状态,这时i元素之前的所有元素都是从小到大排过序的,从有序集合的最后一个元素依次往前搜索,找到一个前一个元素比i元素小,本元素比i元素大的位置,把i元素插入这个元素之前。这里有一个问题,由于数组元素是紧密排列的,要插入元素,就需要一个空位置,这个位置是在往前搜索过程中,逐个把元素往后移一个位置,覆盖i元素后腾出来的。

用C语言写一个函数实现这个算法。

void insertion_sort(int *ai, int n)

{

int i, j;

int ei;

/* 0元素是有序的,从1开始遍历数组中的其他元素,插入有序集 */

for (i = 1; i < n; i++) {

/* 保存当前的元素值,因为要往后移动元素,会覆盖当前元素 */

ei = aii;

/* i-1的元素就是有序集合中的最后一个元素,往前搜索 */

for (j =i-1; j >= 0; j--) {

if (aij < ei)

/* 找到比当前元素小的位置,终止循环 */

break;

/* 当前元素比有序集合中的j元素小,往后移动j元素

* 第一个循环时,aij+1就是aii元素,被覆盖掉

* 后续循环,前一个元素把后一个元素覆盖

*/

aij+1 = aij;

}

/* aij比当前元素小或相等,那么aij+1就是移动后空出来的位置 */

aij+1 = ei;

}

}

其实一个一个的往后移动元素,还是很耗费资源的,我们可以找到插入的位置,然后把需要移动的元素一次性的往后移动一个位置。修改一下程序如下。

static void insertion_sort(int *ai, int n)

{

int i, j;

int ei;

for (i = 1; i < n; i++) {

ei = aii;

/* 可以从头查找,不用倒序查找 */

for (j = 0; j < i; j++) {

if (aij > ei)

/* 找到比当前元素大的位置,退出循环 */

break;

}

/* 移动元素,空出插入的位置 */

memmove(&aij+1, &aij, (i-j)*sizeof(int));

aij = ei;

}

}

相关推荐
Suprman5 分钟前
平面排版问题的数学建模与算法设计
算法·数学建模·排序算法·排版套料
重生之小比特19 分钟前
【算法拾光】二分查找|在排序数组中查找元素的第一个和最后一个位置 + 搜索旋转排序数组
数据结构·算法·排序算法
YukiRinLL34 分钟前
查找与排序算法:复杂度、稳定性
数据结构·算法·排序算法
careathers11 小时前
【数据结构】从堆到 PriorityQueue:手写一个优先级队列
数据结构
y1su13 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
十二19 小时前
【洛谷题解】P1115 最大子段和(前缀和 + 维护最小前缀)
数据结构·c++·算法·蓝桥杯
2501_9339232520 小时前
双指针算法:移动零+复写零(Java)
数据结构·算法·双指针
suhan1 天前
【数据结构】六、图:4.图的遍历(深度优先算法DFS、广度优先算法BFS)
数据结构·算法·排序算法
suhan1 天前
【数据结构】六、图:3.十字链表、邻接多重表、边集数组
数据结构·算法·排序算法
kiracrimson1 天前
STL简单引入:把数据结构做成模板
开发语言·数据结构·c++