第十六章 插入排序法
::: hljs-center
目录
第十六章 插入排序法
●前言
●认识算法
●一、插入排序法是什么?
1.简要介绍
2.图形理解
3.算法分析
●二、案例实现
1.案例一
●总结
:::
前言
排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一堆不规则的数据按照递增或递减的方式重新进行排序。在如今的互联网信息时代,随着大数据和人工智能的发展,大型企业的数据库中有亿级的用户数据量。因此对其进行处理,排序算法也就成为了其中必不可缺的步骤之一。
认识算法
排序功能对计算机领域而言,是一项非常重要而且普遍的工作。排序中数据的移动方式可分为直接移动和逻辑移动两种方式,直接移动是直接交换存储数据的位置,而逻辑移动并不会移动数据存储的位置,仅改变指向这些数据辅助指针的值。排序通常按照数据量的多少和所使用的内存,可分为内部排序和外部排序,数据量小可以全部加载到内存来进行排序的,就称为内部排序,大部分排序属于此类。数据量大而无法一次性加载到内存中,必须借助磁带,磁盘等辅助存储器进行排序的,则称为外部排序。随着数据结构科学的进步,如今,陆续被提出的冒泡排序法,选择排序法,插入排序法,合并排序法,快速排序法,堆积排序法,希尔排序法,基数排序法,直接合并排序法等等,它们各有其特色和其应用场合。并且在算法中,我们非常关注算法程序代码的时间复杂度和空间复杂度,因为它会直接体现出我们程序代码的执行效率以及编程人员的逻辑思维等等的综合能力。当数据量相当庞大时,排序算法所花费的时间就显得相当重要,排序算法的时间复杂度可分为最好情况、最坏情况以及平均情况。另外,对于任何的排序算法都会有数据交换的操作,数据互换位置会暂时用到一个额外的空间,这也是排序算法中空间复杂度要考虑到的问题,而在排序算法中所使用的额外空间越小,它的空间复杂度就越好。
一、插入排序法是什么?
1.简要介绍
插入排序法是将数组中的数据元素逐一与排序好的数据进行比较,先将前两个元素排序好,再将第三个元素插入适当的位置,最终这三个数据元素依旧是已经排序好的状态。接着再将第四个元素加入,继续重复上述步骤,直到排序完成为止。
2.图形理解
用插入排序法对下面的5个数据元素进行从小到大的排序: 排序开始,步骤一如下图所示: 在步骤二中以20为基准,将其与其他元素进行比较之后,20需要插入到56的前面,如下图所示: 在步骤三中以88为基准,将其与其他元素进行比较之后,位置不变,如下图所示: 在步骤四中以62为基准,将其与其他数据元素进行比较之后, 62需要插入到88的前面,如下图所示: 在步骤五中以13为基准,将其与其他数据元素进行比较之后,13需要插入到20的前面,如下图所示: 经过5次的操作即可将这五个数据元素完成从小到大的正确排序,如下图所示:
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();
}
③结果展示:
总结
以上就是对插入排序法的讲解,在上面的图形理解中我们适当的省去了一些中间步骤和过程,直接去展示了插入排序法的重要结果步骤。该排序法也被称为直接排序法,对于少量数据元素的排序来说它是一个有效快捷的算法。在上面的程序案例实现中我们也不难看出,在其实现过程使用了双层循环,外层循环对除了第一个元素之外的所有元素进行操作,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。
<您的三连和关注是我最大的动力> ???? 文章作者:Keanu Zhang 分类专栏:算法之美(C++系列文章)