【排序算法】插入排序(C语言)
【排序算法】—— 插入排序
目录
- 一、插入排序的基本思想
- 二、插入排序的单趟排序
- 1. 直接插入排序
- 2. 二分法插入排序
- 三、插入排序的特点和效率
- 1. 插入排序的特点
- 2. 插入排序的效率
一、插入排序的基本思想
直接插入排序是一种简单的插入排序法,对数组进行一个遍历,每次都对待排的数据按照大小顺序插入到一个有序数组中的特定位置,直到所有的数据全部插入完毕,就得到一个有序数列。
插入排序的算法非常简单,依次对每一个元素进行单趟排序就行了,由于要前一个数比较则只需要从1开始遍历n-1
次,代码如下:
void InsertSort(int* arr, int size)
{int i = 0;for (i = 1; i < size; i++){//单趟排序}
}
二、插入排序的单趟排序
直接插入排序的单趟排序是将当前数值插入到有序序列的指定位置,我们通过当前位置开始从后往前遍历数组,将数值向前移动,直到移动到该数据的指定位置,就完成单趟排序。
由于被插数组是有序的,所以可以顺序向前比较找到插入位置,这种方法称为直接插入排序,也可以通过二分查找找到插入位置,称为二分法插入排序
1. 直接插入排序
每一次比较都将待排数据向前移动一格,直到插入到指定位置
- 如图,当前待排数据为
i
指向的数据4,则要将4插入到[2 3 5 6 8]中使其构成有序数组,变量end
从当前位置开始遍历
end
向前移动,4比8小,则8向后移动一格,4插入到8的前面
end
接着向前移动,与前一个进行比较,4比6小,则6向后移动一位,4插入到6的前面
- end继续遍历,直到遇到比4小的数停止插入,此时单趟排序排序完成
void InsertSort(int* arr, int size)
{int i = 0;for (i = 1; i < size; i++){int end = i;int temp = arr[end]; //记录待排数值while (end > 0){if (arr[end-1] > temp) //若前一个数大于待排数值,则后移一位{arr[end] = arr[end-1];end--;}else{break;}}// arr[end-1] = temp;是之前的错误,现已修正arr[end] = temp; //将数据放入插入位置}
}
2. 二分法插入排序
利用二分查找法查找出插入位置,并将有序数组中插入位置后的数据后移一位,空出插入位置插入数据
- 定义
left
和right
指针,分别指向有序数组的开头和末尾,计算出中间数据的值与待排数据4比较
- 中间数值5大于4,则
right
从mid-1
处开始,查找区间缩小一半,计算出中间值
- 中间值2小于4,则
left
从mid+1
处开始,计算出中间值
- 中间值3小于4,则
left
从mid+1
处开始,但是此时left
大于right
,所以循环停止,left
的位置就是插入位置
- 将待排数据之前,
left
后的数据全部后移一位,空出插入位置,并插入数据,排序完毕
void BInsertSort(int* arr, int size)
{int i = 0;for (i = 1; i < size; i++){int left = 0;int right = i - 1;//查找插入位置while (left <= right){int mid = (left + right) / 2;if (arr[i] < arr[mid]){left = mid + 1;}else{right = mid - 1;}}//后移数据并插入int temp = arr[i];for (right = i; right > left; right--){arr[right] = arr[right-1];}arr[left] = temp;}
}
三、插入排序的特点和效率
1. 插入排序的特点
直接插入排序:
- 越有序的数组单趟移动的次数越少,完全有序的数组时间复杂度只有O(n)O(n)O(n)
- 插入排序是稳定的排序(相同元素排序时不破坏原来的位置,不稳定对结构体类型数据有影响)
二分法插入排序:
- 二分法插入排序面对大量数据时能减少数据的比较次数,有效提高时间效率
- 二分法插入排序也是稳定的
2. 插入排序的效率
时间复杂度:O(n2)O(n^2)O(n2)
空间复杂度:O(1)O(1)O(1)
【排序算法】插入排序(C语言)相关推荐
- 十种经典排序算法精粹(c语言版本)
下面给出这段时间我苦心研究验证过的十种经典排序算法的C语言版本,即下面的排序算法: 插入排序,shell排序,冒泡排序,快速排序,选择排序,堆排序,归并排序,桶排序,基数排序和计数排序.整理出来以作备 ...
- 常见排序算法(C语言实现)
常见排序算法(C语言实现) 文章目录 常见排序算法(C语言实现) 一.插入排序 二.希尔排序 三.选择排序 四.堆排序 五.冒泡排序 六.快速排序 七.归并排序 一.插入排序 void insertS ...
- 数据结构-排序算法(c语言实现篇)
数据结构-排序算法(c语言实现篇) 排序算法是非常常用的算法,从介绍排序的基本概念,到介绍各种排序算法的思想.实现方式以及效率分析.最后比较各种算法的优劣性和稳定性. 1 排序的概念及应用 1.1 排 ...
- 算法学习--排序算法--插入排序
算法学习--排序算法--插入排序 插入排序算法 代码实现 插入排序算法 插入排序(Insertion sort)是一种简单直观且稳定的排序算法.如果有一个已经有序的数据序列,要求在这个已经排好的数据序 ...
- Java排序算法——插入排序(Insertion Sort)
之前总结了交换排序的冒泡排序与选择排序的简单选择排序,这次我们来看看插入排序的简单插入排序~ 往期传送门: 冒泡排序: Java排序算法--冒泡排序(Bubble Sort)https://blog. ...
- 【Java】基础排序算法-插入排序
基础排序算法-------插入排序 实现过程: 插入排序的过程就像整理桥牌的过程:每次将待排元素中的第一个元素插入到有序区间的合适位置,为了给当前待排元素腾出位置,需要将有序区间内所有大于待排元素的其 ...
- python排序算法——插入排序
python排序算法--插入排序 文章目录 python排序算法--插入排序 一.前言 二.描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序算法是指 ...
- c语言插入排序算法伪代码,排序算法——插入排序(C语言实现)
原理 默认数组的第一个数据是有个有序数组,由于只有一个数据,肯定是有序队列.从乱序数组的第二个位置开始,与之前的有序数组中的数据依次作比较,找到合适的位置将该数据插入有序数组,直到将最后一个数据插入有 ...
- 用c语言编写插入排序算法,C语言实现常用排序算法——插入排序
插入排序是最基础的排序算法,原理: 首先1个元素肯定是有序的,所以插入排序从第二个元素开始遍历: 内循环首先请求一个空间保存待插入元素,从当前元素向数组起始位置反向遍历: 当发现有大于待插入元素的元素 ...
- 典型排序算法(C语言实现)
2019独角兽企业重金招聘Python工程师标准>>> <数据结构(C语言版)>的最后一次实验作业(排序),要求如下: 数据结构实验5:排序 要求: 1.直接插入排序: ...
最新文章
- Spring Cloud第六章:配置中心Config
- python【力扣LeetCode算法题库】面试题40- 最小的k个数
- 【杂谈】从GitHub上星星最多的男人开始发GitHub综述资料
- 苹果电脑删除软件_易我Mac数据恢复软件,解决苹果电脑T2芯片数据恢复难题!
- service zookeeper does not support chkconfig解决办法
- MySql轻松入门系列——第一站 从源码角度轻松认识mysql整体框架图
- 去掉字符串后面所有的0 去掉字符串前面或后面的0;
- 关于Windows mobile设备中心,同步软件不出现,打开卡住问题的解决
- DoS攻击之Syn洪泛攻击原理及防御
- 游戏产业链:客户端游戏/网页游戏
- AR/VR/MR三者之间的区别和联系
- android熄屏微信收到原理,求助,如何才能在息屏状态下显示收到的微信消息内容?...
- thinkpad t480 简介文章
- 基于随机森林的分类算法的matlab简单实现
- linux交换分区的命令,LInux下的交换分区以及相关查看命令
- 「达人分享」涨见识了!一段代码就可快速检测微信被删好友
- 最近写了一个预测体彩3D的小软件
- 成都5日--成都-都江堰-青城山-西岭雪山1116
- 软件测试体系学习及构建(21)测试专项丨兼容性测试
- Machine Learning -- 揭开机器学习的面纱