插入排序算法

来源:互联网 发布:重庆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
原创粉丝点击