【排序】经典排序算法动画详解----插入排序C语言实现

插入排序

基本思想:
每次选择一个元素,并且将这个元素和整个数组中的所有元素进行比较,然后插入到合适的位置。
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
⒈ 从第一个元素开始,该元素可以认为已经被排序(先假定第一个待排序元素已排好序)
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5
图解在这里插入图片描述
最初假定3为有序序列,把3以后的元素(例如5)依次和它前面的元素比较(对于5,前面只有3一个数字,只和3比较,5比3大,故比较后位置排在3后)。

时间复杂度
时间复杂度 O(n^2)具有稳定性
代码实现
C语言

void insertion_sort(int arr[], int len){
 2         int i,j,key;//i为序列中待排序元素的在序列中的初始序号
 3         for (i=1;i<len;i++){
 4                 key = arr[i];//key为待排序元素数值
 5                 j=i-1;
 6                 while((j>=0) && (arr[j]>key))//当key前面还有元素需要比较(j>=0)并且此元素数值大于key
                   {
 7                         arr[j+1] = arr[j];//将该元素移到下一位置
 8                         j--;
 9                 }
10                 arr[j+1] = key;//否则,将该元素插入
11         }
12 }

python

def insert_sort(lst):
    n = len(lst)
    if n == 1: return lst
    for i in range(1,n):
        for j in range(i, 0, -1):
            if lst[j] < lst[j-1]: 
                lst[j], lst[j-1] = lst[j-1], lst[j]
            else:
                break
    return lst

对于插入排序:交换次数和序列中逆序对的个数相同。每次交换只能消掉一个逆序对。
逆序对:对于下标 i < j i<j i<j 并且 d a t a [ i ] > d a t a [ j ] data[i]>data[j] data[i]>data[j],则 ( i , j ) (i,j) (i,j) 是一对逆序对。
时间复杂度: T ( N , I ) = O ( N + I ) T(N,I)=O(N+I) T(N,I)=O(N+I)
如果序列整体有序,则插入排序简单高效!

ps:
该系列其他博文:
【排序】经典排序算法动画详解——堆排序C语言实现
【排序】经典排序算法动画详解——冒泡排序C语言实现

以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值