插入排序与算法分析

Posted 算法小筑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入排序与算法分析相关的知识,希望对你有一定的参考价值。

 插入排序与算法分析



01


插入排序


 插入排序工作方式:

    所要排序的数组为[5, 2, 4, 6, 1, 3].

    1、首先拿出5, 变为: [5] [2, 4, 6, 1, 3].

    2、取出2, 把 2 插入到5所在的数组中, 得到 [2, 5]. 这时变为[2, 5] [4, 6, 1, 3].

    3、取出4, 把 4 插入到[2, 5]中, 得到 [2, 4, 5]. 变为[2, 4, 5] [6, 1, 3].

    4、取出6, 把 6 插入到[2, 4, 5]中,得到[2, 4, 5, 6].变为[2, 4, 5, 6] [1, 3]

    5、取出1, 把 1 插入到[2, 4, 5, 6].变为[1, 2, 4, 5, 6] [3].

    6、取出3, 把 3 插入到[1, 2, 4, 5, 6].变为[1, 2, 3, 4, 5, 6].


02


视频理解



视频做完有点问题.不影响大局


03


代码Python版

# coding=utf-8
def insert_sort(seq): """ 插入排序 """ n = len(seq) for i in range(1, n): value = seq[i] pos = i while pos > 0 and value < seq[pos-1]: seq[pos] = seq[pos-1] pos -= 1 seq[pos] = value return seq

if __name__ == '__main__': import random    randomlist = random.sample(range(30, 70), 8) print(insert_sort(randomlist))


04


C语言版本

#include<stdio.h>#include <stdlib.h>#include <time.h>
#define N 8
void insert_sort(int *a, int n){ for (int i = 1; i < n; i++) { int j = 0; while (*(a + j) < *(a + i) && (j < i)) { j++; } if (i != j) { int temp = *(a+i); for (int k = i; k > j; k--) { *(a + k) = *(a + k - 1); } *(a+j) = temp; } }}
int * random_list(){ static int a[N], aa;  int i;  srand((unsigned)time(NULL)); for (i = 0; i < N-1; i++) { aa = rand() % 20 + 1; a[i] = aa; } return a;}
int main(){ int *num; num = random_list(); insert_sort(num, N); for (int i = 0; i < N; i++) printf("%d ", num[i]); printf("\n"); return 0;}

05


算法分析


    分析算法的结果意味着预测算法需要的资源. 通常我们想度量的是计算时间. 通过分析求解某个问题的几种候选算法,我们可以选出一种最有效的算法.抛弃几个较差的算法.

    插入排序最坏情况运行时间表示为a*n^2+bn+c,一个二次函数, 我们真正感兴趣的是运行时间的增长率或增长量级. 我们只考虑公式中最重要的项如:a*n^2, 因为当n增大时, 低价项相对来说不是很重要n 肯定没有n^2增长的快. 忽略不重要的常数项系数.最后剩下的就是n^2,我们记插入排序最坏运行时间为θ(n^2). 后面会讲精确的定义.

如果喜欢本文请扫码关注:

以上是关于插入排序与算法分析的主要内容,如果未能解决你的问题,请参考以下文章

算法分析与设计——各类排序算法

数据结构与算法 排序算法 附有详细动画流程分析图

深入浅出理解排序算法系列 插入排序算法的实现与性能分析

数据结构与算法学习笔记(10) 排序

算法设计与分析——十大经典排序算法一(1--5)

插入排序(直接插入排序折半插入排序希尔排序的算法思想及代码实现)