插入排序的总结
Posted 菜鸟沃土
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入排序的总结相关的知识,希望对你有一定的参考价值。
数据结构排序算法之——插入排序(Insert Sort)
代码很多地方借鉴了 http://my.csdn.net/MoreWindows 他的思想,
本人认为该作者已经写的很好了,只是在他的基础上加入了一些自己的理解和说明
如果涉及到版权的问题,请联系我的邮箱,我会尽快删除
插入排序想关链接:
维基百科:https://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F
百度百科:http://baike.baidu.com/view/396887.htm
参考博客 :http://blog.csdn.net/morewindows/article/details/6665714
插入排序的基本思想(由大到小):
最开始时,将第一个位置(也就是数组中下标为0的元素)的元素看做有序的,将后面的元素与它进行比较,如果后面的比前面的大,则将后面的和前面的交换位置
…………
依次在后面的无序的元素中选取第一个无序数与前面已经有序的元素进行比较找到一个合适的位置(如果从有序的位置从前向后比较,则找到第一个不大于它的数,如果从后向前找,是找第一个不小于它的数),将插入位置到待有序结尾的位置依次向后移动一个位置,将带插入元素插入当前有序的数组,形成新的有序数组
代码:
void Insert_Sort(int array[], int arrayLen)
{
// 由大到小
// 将第一个元素(0)视为有序的,则第二个元素(1)开始
for (int i = 1; i < arrayLen; ++i)
{
// 从开始比较
for (int j = 0; j < i; ++j)
{
// 找到第一 不大于 当前数据的值
if (array[j] < array[i])
{
int tempInsertNum = array[i];
int k = i;
// 将所有的元素向后移动一个
while(k>=0&& k>j)
{
array[k] = array[k - 1];
--k;
}
// 将元素插入数组中
array[k] = tempInsertNum;
// 已经成功插入 ,执行下一次外循环
break;
}
}
}
}
一种该进的思想是: 在从有序的后面开始比较,每比较一次向后移动一次
直到找到合适的插入位置结束
void Insert_Sort_Improve1(int array[], int arrayLen)
{
// 由大到小
// 将第一个元素(0)视为有序的,则第二个元素(1)开始
for (int i = 1; i < arrayLen; ++i)
{
// 如果是array[i]<= array[i-1] 则前面的数都比array[i] 大,则当前有序
if (array[i] > array[i - 1])
{
int tempInsertNum = array[i];
int j = i - 1;
while (j >= 0 && array[j] < tempInsertNum)
{
// 一边比较,一边移动
array[j + 1] = array[j];
-- j;
}
// 多执行了一次 -- j
array[j + 1] = tempInsertNum;
}
}
}
还有一种改进思想是使用值交换来代替数据的移动
void Insert_Sort_Improve2(int array[], int arrayLen)
{
for (int i = 1; i < arrayLen; ++i)
{
// 如果是array[j] >= array[j+1] 则前面的数都比array[j+1] 大,则当前有序
for (int j = i - 1; j >= 0 && array[j + 1] > array[j]; -- j)
Swap_IntVal(array + j + 1, array + j);
}
}
详细的代码:代码地址应该会选择放在github,但是最近我对github的操作还不是很熟悉
以上是关于插入排序的总结的主要内容,如果未能解决你的问题,请参考以下文章