算法踩坑2-插入排序

背景

接上面一篇文章 算法踩坑-快速排序 来继续聊聊最近我写的一些算法的小例程。
主要从以下几方面来说的:

  • 插入排序思想
  • 插入排序实现
  • 插入排序优化

插入排序思想

插入排序的思想是从第i个位置开始,逐个的往前面i个有序的序列中插入第i个元素,最终i到达末尾的时候,整个序列就都是有序的了。

无序序列指针

从第i+1个位置开始遍历,一直到整个序列的末尾N

有序序列指针

从有序序列的前一个位置开始一直往前遍历,一直到序列的开头,把无序序列的元素插入到指定的位置

插入排序实现

插入排序的思想很简单,所以实现也是很简单的,只有不到十行代码

void Insertionsort(ElementType arr[], int count) {
    int i;
    int j;
    for (i = 1; i < count; i++) {
        ElementType tmp = arr[i];
        // 把i位置的元素插入到前i个元素中
        // tmp < arr[j-1] 这个判断条件需要加在for循环的判断条件中,
        // 否则会出现j多减1的情况,导致排序出问题
        for (j = i; j > 0 && tmp < arr[j-1]; j--) {
            // 往后移动一个位置
            arr[j] = arr[j-1];
        }
        arr[j] = tmp;
    }
}

插入排序优化

从无序的序列中把元素插入到有序序列中,这是插入排序可以优化的部分。
第一种实现方式是:循环交换两个元素

void Insertionsort1(ElementType arr[], int count) {
    int i;
    int j;
    for (i = 1; i < count; i++) {
        ElementType tmp = arr[i];
        for (j = i; j > 0 && tmp < arr[j-1]; j--) {
            // 交换元素
            tmp = arr[j];
            arr[j] = arr[j-1];
            arr[j - 1] = tmp;
        }
    }
}

这种方式不好的地方在于频繁的交换元素需要付出额外的时间代价
第二种实现:从后往前循环的比较有序与当前的的插入元素,把不符合有序元素逐个的往后移动,直到复合条件位置,这个位置就是插入元素的位置。

 ElementType tmp = arr[i];
// 把i位置的元素插入到前i个元素中
// tmp < arr[j-1] 这个判断条件需要加在for循环的判断条件中,
// 否则会出现j多减1的情况,导致排序出问题
for (j = i; j > 0 && tmp < arr[j-1]; j--) {
    // 往后移动一个位置
    arr[j] = arr[j-1];
}
arr[j] = tmp;

One More Thing

噢!我是算法,点我

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,105评论 0 15
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,606评论 0 52
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 6,813评论 0 35
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到已排序好...
    依依玖玥阅读 5,036评论 0 2
  • 我迈着轻快的脚步, 在垂柳依依的河边走过, 浑然不知它有着怎样的故事和传说。 它苍老的脸被清风逗笑, 皱纹层层叠叠...
    读云轩札记阅读 1,468评论 0 0

友情链接更多精彩内容