插入排序的思想是:给定一个待排序的数组,我们从中选择第一个元素作为有序的基态(单个元素肯定是有序的), 然后从剩余的元素中选择一个插入到有序的基态中,使插入之后的序列也是有序状态,重复此过程,直到全部有序为止。该过程很类似我们玩扑克牌进行摸牌的过程吧。

核心点:

1  插入排序可以实现原址排序,不需要借助额外的空间。

2 插入排序是稳定排序。

3 插入排序的时间复杂度为O(n*n).

代码如下:

  /***********************************************************************
* Copyright (C) 2019 Yinheyi. <chinayinheyi@163.com>
*
* This program is free software; you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version. * Brief:
* Author: yinheyi
* Email: chinayinheyi@163.com
* Version: 1.0
* Created Time: 2019年05月05日 星期日 21时48分52秒
* Modifed Time: 2019年05月09日 星期四 00时14分23秒
* Blog: http://www.cnblogs.com/yinheyi
* Github: https://github.com/yinheyi
*
***********************************************************************/ #include <iostream>
// 插入排序的实现(insertion-sort)
// 思想:1. 首先从待排序的数组中选择一个数作为初始有序状态的序列;
// 2. 然后再从数组中选择下一个数,插入到有序序列中的合适位置,使新的序列也是有序的;
// 3. 不断重复这个过程......
//
// 核心点:1. 合理安排代码,使插入排序不需要额外的空间的, 进行原址排序。
// 2. 如何找到合适的插入位置,以及插入时怎么移动其它的相关数据问题。
//
// 代码如下, 该函数默认从小到大排序:
void insertion_sort(int array[], size_t nLength_)
{
// 参数的检测
if (array == nullptr || nLength_ < )
return; for (size_t i = ; i < nLength_; ++i) // 注意:i是从1开始
{
int _nCurrent = array[i]; // 当前待排序的数字 // 此时,下标为 0 ~ i-1的数字是有序的. 向后移动比当前序数字大的所有数,为该数腾出一> 个位置来。
int _nLessEqualIndex = i - ;
while (_nLessEqualIndex >= && array[_nLessEqualIndex] > _nCurrent)
{
array[_nLessEqualIndex + ] = array[_nLessEqualIndex];
--_nLessEqualIndex;
}
// 把新数插入到合适的位置
array[_nLessEqualIndex + ] = _nCurrent;
}
} // 该函数实现输出数组内的元素。
void PrintArray(int array[], size_t nLength_)
{
for (size_t i = ; i < nLength_; ++i)
{
std::cout << array[i] << " ";
}
std::cout << std::endl;
} // 测试
/*************** main.c *********************/
>>int main(int argc, char* argv[])
{
int array[] = {, , , , , -, , , , -}; std::cout << "排序前:" << std::endl;
PrintArray(array, ); insertion_sort(array, ); std::cout << "排序后:" << std::endl;
PrintArray(array, ); return ;
}

排序算法的c++实现——插入排序的更多相关文章

  1. 排序算法三:Shell插入排序

    排序算法三:Shell插入排序 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 引言 在我的博文<"主宰世界"的10种算法短评> ...

  2. 排序算法review<1>--直接插入排序

    简单插入排序的基本思想:对于原待排序记录中的第i(1<=i<=n-1)个元素Ki,保证其前面的i个元素已经是有序的,要在这前i个元素(K0--Ki-1)中找到合适的位置将第i个元素插入,具 ...

  3. 内部排序算法(交换排序,插入排序)注意点(C语言实现)

    对于算法思想的理解可以参考下面的这个帖子,十大经典排序算法(动图演示) - 一像素 - 博客园,因为算法的逻辑和数学很像,相应的基础资料一般也能在网上找到,所以,本帖子这谈论一些重要的注意点,其他人讲 ...

  4. Java 常用排序算法实现--快速排序、插入排序、选择、冒泡

      public class ArrayOperation {    //二分查找算法    public static int branchSearch(int[] array, int searc ...

  5. 排序算法<No.6>【插入排序】

    算法,我在路上,将自己了解的算法内容全部梳理一遍! 今天介绍简单点的,插入排序. 首先,什么是插入排序,这个维基百科上有.个人的理解,就是将一个数插入到一个已经排好序的数列当中某个合适的位置,使得增加 ...

  6. python实现排序算法(一)——插入排序算法

    ''' 插入排序算法 原始数据data 排序数据后数据SortedData,默认是从小打大排序 1.从data第一个元素开始,该元素赋值给SortedData[0],可以认为SortedData已经被 ...

  7. 【Java】 大话数据结构(18) 排序算法(5) (直接插入排序)

    本文根据<大话数据结构>一书,实现了Java版的直接插入排序. 更多:数据结构与算法合集 基本概念 直接插入排序思路:类似扑克牌的排序过程,从左到右依次遍历,如果遇到一个数小于前一个数,则 ...

  8. Java排序算法(三):直接插入排序

    [基本思想] 关键:在前面已经排好序的序列中找到合适的插入位置 步骤: 1. 从第一个元素開始,该元素能够觉得已经排好序. 2. 取出下一个元素.在已经排好序的元素序列中从后往前扫描进行比較. 3. ...

  9. 矿Java开发学习之旅------&gt;Java排序算法经典的二分法插入排序

    一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为採用折半比較,就可以得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比較 ...

  10. 排序算法C语言实现——插入排序(优于冒泡)

    为什么插入排序要优于冒泡? 插入排序在于向已排序序列中插入新元素,主要的动作是移动元素,涉及1次赋值,即data[j] = data[j-1]; 而冒泡排序在于相邻元素交换位置,涉及3条赋值,即iTm ...

随机推荐

  1. 异常CLRDBG_NOTIFICATION_EXCEPTION_CODE( 0x04242420)

    简介 CLRDBG_NOTIFICATION_EXCEPTION_CODE,值为0x0x04242420.此异常在.CLR 4.0的启动路径期间触发,是CLR4.0版本初始化调试服务时向调试器发送消息 ...

  2. Linux下网络socket编程——实现服务器(select)与多个客户端通信

    一.关于socket通信 服务器端工作流程: 调用 socket() 函数创建套接字 用 bind() 函数将创建的套接字与服务端IP地址绑定 调用listen()函数监听socket() 函数创建的 ...

  3. 【CF573E】Bear and Bowling

    [CF573E]Bear and Bowling 题面 洛谷 题解 首先有一个贪心的结论: 我们一次加入每个数,对于\(\forall i\),位置\(i\)的贡献为\(V_i = k_i\times ...

  4. concurrent (二)AQS

    参考文档: https://www.cnblogs.com/waterystone/p/4920797.html

  5. python安装 hanlp +使用 坑坑坑。。。填填填。。。

    刚开始用都不知道要怎么安装,包括什么文件.百度了下发现正常安装就可以用,不用下多余的东西,但是但是但是但是但是但是但是但是 用pycharm安装不行,pip安装不行,也是见鬼了. 解决方法: 1.手动 ...

  6. 宏offsetof分析

    1.前言 在C语言的结构体中,由于字节对齐的问题,所以成员的地址并不能直接根据数据类型的大小进行计算,使用宏offsetof可以获得结构体成员相对于结构体首地址的字节偏移量. 2.offsetof宏实 ...

  7. linux系统命令别名,打造属于自己的个性linux系统

    linux操作系统,个性化快捷命令,让你的系统更懂你,让你的操作更快捷. 在你使用linux操作系统的时候,有时候输入命令过长的话会显得很麻烦,这个时候,linux操作系统支持的命令别名很大程度上解决 ...

  8. Zookeeper connection loss leads to Flink job restart

    Flink可以使用zookeeper来进行ha,而一般我们都会使用zookeeper的高级api架构curator来对zk进行通讯.在curator中引入了状态的概念,包括connected,reco ...

  9. Java里 equals 和 == 以及 hashcode

    本文探讨的是老掉牙的基础问题,先建个实体类 package com.demo.tools; public class User { private String name; public User(S ...

  10. 第十五节:Asp.Net Core中的各种过滤器(授权、资源、操作、结果、异常)

    一. 简介 1. 说明 提到过滤器,通常是指请求处理管道中特定阶段之前或之后的代码,可以处理:授权.响应缓存(对请求管道进行短路,以便返回缓存的响应). 防盗链.本地化国际化等,过滤器用于横向处理业务 ...