基本概念

直接插入排序是一种最简单的排序方法,排序过程为:先将第一个元素看作是只有一个元素的有序子表,然后从第二个元素开始,将待排序元素依次插入到前面有序的子表中,直到全部排序完毕。在整个过程中,前面的元素是已经排序号的列表,后面的元素为待排序处理。

基本过程

将第一个元素看作是一个有序的列表,从第二个元素开始将元素与有序部分中的元素比较找到合适的插入位置,将插入位置后的元素依次后移一个位置。在最好的情况下表中的元素已经是有序表只需要比较不需要移动,这是的时间复杂度是O(n)。最坏的情况下,表中的元素是逆序的比较次数达到最大为:∑ni=2 i,总的移动次数也达到最大为∑ni=2  (i+1)。平均的情况下带排序的元素是随机的,此时可以去上诉情况的平均值作为平均情况下的时间复杂度总的比较和移动的平均次数约为n2/4。所以直接插入排序的时间复杂度为O(n2)。

排序过程中需要一个辅助空间,所以时间复杂度为O(1)。


如下排序是将列表{ 7,3,5,4,6 }升序的排序过程。

以下是C++代码实现:

#include <iostream>

using namespace std;

//创建数组
void CreateArry(int arry[], int len)
{
cout << "输入数组的元素。。。" << endl;
int key;
for (int i = ; i < len; i++)
{
cin >> key;
arry[i] = key;
}
} //直接插入排序
void Inert_Sort(int arry[], int len)
{
int i, j;
for (i = ; i < len; ++i)
{
int temp = arry[i];
for (j = i - ; j >= ; --j)
{
if (temp < arry[j])
{
arry[j + ] = arry[j]; //在有序列表中比temp值大的元素后羿
}
else { break; }//temp大于有序表中的最后一位则不需要移动
}
arry[j+] = temp;//跳出内层循环后插入在合适的位置
}
} //打印数组
void Print(int arry[], int len)
{
for (int i = ; i < len; i++)
{
cout << arry[i] << " ";
}
cout << endl;
} void test01()
{
int arry[];
int len = sizeof(arry) / sizeof(arry[]);
CreateArry(arry, len);
Inert_Sort(arry, len);
Print(arry, len);
} int main()
{
test01(); system("pause");
return ;
}

运行结果:

输入待排序序列 7,3,5,4,6

c++实现直接插入排序的更多相关文章

  1. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  2. Html5 直接插入排序

    直接插入排序算法(Straight Insertion Sort),是排序算法中简单的一种算法,基本思想如下: 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第 ...

  3. python排序之一插入排序

    python排序之一插入排序 首先什么是插入排序,个人理解就是拿队列中的一个元素与其之前的元素一一做比较交根据大小换位置的过程好了我们先来看看代码 首先就是一个无序的列表先打印它好让排序后有对比效果, ...

  4. java基础算法之插入排序

    一.插入排序介绍 插入排序(Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通 ...

  5. [LeetCode] Insertion Sort List 链表插入排序

    Sort a linked list using insertion sort. 链表的插入排序实现原理很简单,就是一个元素一个元素的从原链表中取出来,然后按顺序插入到新链表中,时间复杂度为O(n2) ...

  6. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

  7. 经典排序算法 – 插入排序Insertion sort

    经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...

  8. C语言中的插入排序(2016-12-30)

    直接插入排序: 算法思想:假设待排序的记录存放在数组R[1--n]中,初始时,i=1,R[1]自成一个有序区,无序区为R[2--n].然后从i=2起直到i=n,依次将R[i]插入当前的有序区R[1.. ...

  9. JavaScript算法(冒泡排序、选择排序与插入排序)

    冒泡排序.选择排序与插入排序复杂度都是二次方级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看<学习JavaScript数据结构与算法>介绍的冒泡排序,选择排序看 ...

  10. 基本排序算法——插入排序java实现

    插入排序过程: 在初始状态下,第一个元素是排序的,在最终状态下,作为一组数据时排序的. 代码如下;eclipse4.3实现 package sort.basic; import java.util.A ...

随机推荐

  1. Selenium 加载Chrome/Firefox浏览器配置文件

    Selenium启动浏览器时,默认是打开一个新用户,不会加载原有的配置以及插件.但有些时候我们可能需要加载默认配置. 一.Chrome浏览器 1.在Chrome浏览器的地址栏输入:chrome://v ...

  2. JavaWeb_使用dom4j解析、生成XML文件

    dom4j 官网 xml解析DOM文档对象模型(树形结构) DOM方式解析:把xml文档加载到内存形成树形结构,可以进行增删改的操作 Learn   使用dom4j解析文件"NewFile. ...

  3. [CSP-S模拟测试]:字符交换(贪心+模拟)

    题目传送门(内部题136) 输入格式 输入文件第一行为两个正整数$n,k$,第二行为一个长度为$n$的小写字母字符串$s$. 输出格式 输出一个整数,为对字符串$s$进行至多$k$次交换相邻字符的操作 ...

  4. RedisTemplate 用法

      Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有 ...

  5. C++入门经典-例3.2-根据分数判断是否优秀

    1:代码如下: // 3.2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  6. leetcode-easy-string-7 Reverse Integer

    mycode class Solution(object): def reverse(self, x): """ :type x: int :rtype: int &qu ...

  7. Java内存泄漏分析和预防

    1. 什么是内存泄漏?有什么危害 书面说法: 内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器没办法移除它们,因为还在被引用着. 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个 ...

  8. NMS(非极大值抑制算法)

    目的:为了消除多余的框,找到最佳的物体检测的位置 思想: 选取那些领域里分数最高的窗口,同时抑制那些分数低的窗口 Soft-NMS

  9. 等式变换java解法

    输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立. 1 2 3 4 5 6 7 8 9 = X 比如: 12-34+5-67+89 = 5 1+23+4-5+6-7-8-9 ...

  10. block(块级元素)和 inline(内联元素) 的区别

    block(块级元素)和 inline(内联元素) 的区别 (2009-01-05 10:32:07) 转载▼ 标签: 杂谈 分类: div+css div这样的块级元素,就会自动占据一定矩形空间,可 ...