插入排序的基本思想:插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有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
动画演示:
兑现代码:
<?php
function 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;
}