插入排序与算法分析
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). 后面会讲精确的定义.
如果喜欢本文请扫码关注:
以上是关于插入排序与算法分析的主要内容,如果未能解决你的问题,请参考以下文章