【八大数据排序法】插入排序法的图形理解和案例实现 | C++

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一堆不规则的数据按照递增或递减的方式重新进行排序。在如今的互联网信息时代,随着大数据和人工智能的发展,大型企业的数据库中有亿级的用户数据量。因此对其进行处理,排序算法也就成为了其中必不可缺的步骤之一。

前言

       排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一堆不规则的数据按照递增或递减的方式重新进行排序。在如今的互联网信息时代,随着大数据和人工智能的发展,大型企业的数据库中有亿级的用户数据量。因此对其进行处理,排序算法也就成为了其中必不可缺的步骤之一。


认识算法

       排序功能对计算机领域而言,是一项非常重要而且普遍的工作。排序中数据的移动方式可分为直接移动和逻辑移动两种方式,直接移动是直接交换存储数据的位置,而逻辑移动并不会移动数据存储的位置,仅改变指向这些数据辅助指针的值。排序通常按照数据量的多少和所使用的内存,可分为内部排序和外部排序,数据量小可以全部加载到内存来进行排序的,就称为内部排序,大部分排序属于此类。数据量大而无法一次性加载到内存中,必须借助磁带,磁盘等辅助存储器进行排序的,则称为外部排序。随着数据结构科学的进步,如今,陆续被提出的冒泡排序法,选择排序法,插入排序法,合并排序法,快速排序法,堆积排序法,希尔排序法,基数排序法,直接合并排序法等等,它们各有其特色和其应用场合。并且在算法中,我们非常关注算法程序代码的时间复杂度和空间复杂度,因为它会直接体现出我们程序代码的执行效率以及编程人员的逻辑思维等等的综合能力。当数据量相当庞大时,排序算法所花费的时间就显得相当重要,排序算法的时间复杂度可分为最好情况、最坏情况以及平均情况。另外,对于任何的排序算法都会有数据交换的操作,数据互换位置会暂时用到一个额外的空间,这也是排序算法中空间复杂度要考虑到的问题,而在排序算法中所使用的额外空间越小,它的空间复杂度就越好。


一、插入排序法是什么?

1.简要介绍

       插入排序法是将数组中的数据元素逐一与排序好的数据进行比较,先将前两个元素排序好,再将第三个元素插入适当的位置,最终这三个数据元素依旧是已经排序好的状态。接着再将第四个元素加入,继续重复上述步骤,直到排序完成为止。


2.图形理解

       用插入排序法对下面的5个数据元素进行从小到大的排序:

       排序开始,步骤一如下图所示:

        在步骤二中以20为基准,将其与其他元素进行比较之后,20需要插入到56的前面,如下图所示:

        在步骤三中以88为基准,将其与其他元素进行比较之后,位置不变,如下图所示:

       在步骤四中以62为基准,将其与其他数据元素进行比较之后, 62需要插入到88的前面,如下图所示:        在步骤五中以13为基准,将其与其他数据元素进行比较之后,13需要插入到20的前面,如下图所示:      

        经过5次的操作即可将这五个数据元素完成从小到大的正确排序,如下图所示:

fdd2e2676ee9bb4bd8c0b1b6c7d64ddc_d0a896cc87af4d7c8dc8c462d29668f7.png



3.算法分析

       ①插入排序法是稳定排序法。


       ②插入排序法只需要一个额外的空间,所以空间复杂度为最佳。


       ③插入排序法适用于大部分数据已经排过序的情况,也适用于往已排序数据库中添加新数据后再去进行排序的情况。


       ④插入排序法由于会出现大量数据迁移的情况,所以建议在链表上使用。


       ⑤该排序法的最坏情况和平均情况的时间复杂度为O(n^2),最好情况的时间复杂度为O(n)。


二、案例实现

1.案例一

①范例情况:使用插入排序法对6、4、3、1、32、10这6个数据元素进行从小到大的排序,并且输出每次步骤后的排序情况。


②代码展示:

#include<iostream>
using namespace std;
#define size 6 //事先声明排序数据的个数
class insert {
public:
  int data[size];
  void showresult(){
  for (int i = 0; i < size; i++)
    cout <<" " << data[i];
  cout << endl;
  }
  void insert_start() {
  for (int i = 1; i < size; i++)     //扫描循环的次数为 size-1
  {
    int temp;    //开辟一块空间用来暂时存储数据元素
    temp = data[i];    
    int j = i - 1;
    while (j >= 0 && temp < data[j])     //用来比较temp中暂存数据元素与其后面未排序元素的大小
    {
    data[j+1] = data[j];     //把数据元素往后推一个位置
    j--;     //循环执行的判断条件
    }
    data[j + 1] = temp;    //最小的数据元素放到第一个位置
    cout << "第" << i << "次扫描:";
    showresult();
  }
  }
};
void text()
{
  insert is;
  cout << "请输入要排序的" << size << "个数据" << endl;
  for (int i = 0; i < size; i++)
  cin >> is.data[i];
  cout << "排序前:" << endl;
  is.showresult();
  is.insert_start();
  cout << "排序后:" << endl;
  is.showresult();
}
int main()
{
  text();
}

③结果展示:

f30cd900327a101e8df655da62584be6_fabf7e2458a043e1aa271da4fc4c2c42.png


总结

       以上就是对插入排序法的讲解,在上面的图形理解中我们适当的省去了一些中间步骤和过程,直接去展示了插入排序法的重要结果步骤。该排序法也被称为直接排序法,对于少量数据元素的排序来说它是一个有效快捷的算法。在上面的程序案例实现中我们也不难看出,在其实现过程使用了双层循环,外层循环对除了第一个元素之外的所有元素进行操作,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。


相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
3月前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
54 3
|
3月前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
55 3
|
4月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
103 1
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
4月前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
53 2
|
4月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
3月前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
25 0
|
4月前
|
存储 数据挖掘 C语言
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
|
4月前
|
存储 安全 数据处理
【C++】C++ 超市会员卡管理系统(面向对象)(源码+数据)【独一无二】
【C++】C++ 超市会员卡管理系统(面向对象)(源码+数据)【独一无二】
102 1
|
5月前
|
设计模式 监控 Go
开发与运维C++问题之C++部分原有的数据发送能力如何解决
开发与运维C++问题之C++部分原有的数据发送能力如何解决
27 1
|
4月前
|
存储 算法 C++
【C/C++】C/C++ KTV点歌系统设计与实现(源码+数据+报告)【独一无二】
【C/C++】C/C++ KTV点歌系统设计与实现(源码+数据+报告)【独一无二】