插入排序算法
来源:互联网 发布:重庆seo入门到精通 编辑:程序博客网 时间:2024/06/05 00:42
插入排序的基本思想:插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列
的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等
的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。
常见的插入排序有插入排序(Insertion Sort),希尔排序(Shell Sort),二叉查找树排序(Tree Sort),图书馆排序(Library Sort),Patience排序(Patience Sort)。下面
介绍第一种直接插入排序:
直接插入排序
最差时间复杂度:O(n^2)
最优时间复杂度:O(n)
平均时间复杂度:O(n^2)
稳定性:稳定
直接插入排序(Insertion Sort),是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序算法的一般步骤:
1.从第一个元素开始,该元素可以认为已被排序;
2.取出下一个元素,在已经排序的元素序列中从后向前扫描;
3.如果该元素(已排序)大于新元素,将该元素移到下一个位置;
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
5.将新元素插入到该位置后,重复2~5
动画演示:
兑现代码:
<?phpfunction insert_sort($arr){ $len = count($arr); $k=-1; //外循环遍历获得拿出元素 for ($i=1; $i < $len; $i++) { $temp = $arr[$i];//拿出元素 $k=$i; for ($j=$i-1; $j >=0; $j--) { if ($arr[$j]>$temp) {//和当前元素前面的元素比较 $arr[$j+1]=$arr[$j];//元素后移 $k=$j;//记录待插入的位置 } $arr[$k]=$temp;//插入元素 } //var_dump($arr); } return $arr;}$list= array('49','38','65','97','13','27');$list = insert_sort($list);var_dump($list);
c语言版本
#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include<stdio.h>#include <string.h>//插入排序 稳定void insert_sort(int array[],int len){int i,j,k = 0,tmp;//从数组下标为1的位置开始拿元素for (i = 1;i<len;i++){tmp = array[i];//拿出元素k = i;//待插入的位置//拿出的元素和前面的元素比较 若拿出的元素小 则让数组元素后移for (j = i-1;(j>=0)&&(array[j]>tmp);j--){array[j+1] = array[j];//元素后移k = j;//记录要插入的位置}//插入array[k] = tmp;}}void printArray(int array[],int len){int i = 0;for (i=0;i<len;i++){printf("%d ",array[i]);}}int main(){int array[] = {38,49,65,76,97,27};insert_sort(array,6);printArray(array,6);system("pause");return 0;}
0 0
- 排序算法-插入排序
- 排序算法--插入排序
- 排序算法---插入排序
- 排序算法-插入排序
- 排序算法-插入排序
- 排序算法--插入排序
- 排序算法-插入排序
- 排序算法-插入排序
- 排序算法---插入排序
- 排序算法--插入排序
- 排序算法--插入排序
- 排序算法--插入排序
- 排序算法-插入排序
- 排序算法--插入排序
- 排序算法-插入排序
- 排序算法-插入排序
- 排序算法--插入排序
- 排序算法-插入排序
- 计算总分和平均分
- 配置Log4j(很详细)
- vim查找/替换字符串
- 了解悲观锁和乐观锁
- leetcode【169 Majority Element】【Python】
- 插入排序算法
- Android USB 通讯相关的
- 22个值得收藏的Android开源代码-UI篇
- 如何使用ChemDraw绘制催化反应方程式
- JavaScript Array 对象
- 跨域资源共享 CORS 详解
- 关于从服务器下载的新版apk更新失败的问题
- 配置SqlSessionFactory,整合Mybatis
- 剑指offer面试题16:反转链表