插入排序----直接插入排序(C、C++、Python、Shell)

直接插入排序(insert-sort)

基本思想:在一组有序的数据序列中,插入数据,仍然要求插入后此数据序列是仍然有序的。适用于少量数据的排序。

 

平均时间复杂度:O(n2)

最好时间复杂度:O(n)

最坏时间复杂度:O(n2)

稳定性:稳定排序

 

算法实现的步骤:

假设有一组待排序的数据序列a,长度为10:

位置(i):  0   1  2   3   4  5   6   7   8   9

初始序列: 60  34  24  11 67  45  98  111  10  3

第一趟:   34  60  24  11 67  45  98 111  10  3

第二趟:   24  34  60 11 67  45  98 111  10  3

第三趟:   11  24  34  60  67  45 98  111  10  3

第四趟:   11  24  34  60 67 45 98  111  10  3

第五趟:   11  24  34  45  60  67  98  111  10  3

第六趟:   11  24  34 45  60 67 98 111  10  3

第七趟:   11  24  34 45  60 67 98 111 10  3

第八趟:   10  11  24 34  45  60  67  98  111 3

第九趟:    3  10 11  24  34 45  60  67 98  111

 

思路为:第一个元素a[0]为有序,将第二个元素a[1]插入前面一个元素a[0],再将第三个元素a[2]插入到a[0]、a[1]当中,以此类推,第k个元素a[k] 插入到前k-1个元素中,且前k-1个元素a[0]、a[1]…a[k-1]为有序序列,因此可以得到有序数组。

 

平均时间复杂度:O(n2)

最好时间复杂度:O(n)

最坏时间复杂度:O(n2)

 

代码实现方法

C语言版:

void insert_sort(int arr[],int n)
{
        int tmp,flag;
        int i,j;
        for(i=1;i<n;i++)
        {
               tmp=arr[i];
               flag=i;
               for(j=i-1;j>=0;j--)
               {
                      if(tmp<arr[j])
                             arr[flag--]=arr[j];
                      else
                             break;
               }
               arr[flag]=tmp;
        }
}

C++语言版:

template<classT>
void insert_sort(T arr[],int n)
{
        int i,j;
        for(i=1;i<n;i++)
        {
               T tmp=arr[i];
               for(j=i;j>0 &&tmp<arr[j-1];j--)
                      arr[j]=arr[j-1];
               arr[j]=tmp;
        }
}
 

Python版:

#!/usr/bin/python
definsert_sort(arr):   ##定义的函数
        for i in range(1,len)
               tmp=arr[i]
               j=i
        while j>0 and tmp<arr[j-1]
               arr[j]=arr[j-1]
               j-=1
        arr[j]=tmp

Shell版本:

#!/usr/bin/bash
read–a arr
for((i=1;i<${#arr[@]};i++))
do
        tmp=${arr[i]}
        for((j=i;j>0 && $tmp<${arr[j-1]};j--))
        do
               arr[j]=${arr[j-1]}
        done
        arr[j]=$tmp
done
 
for((i=0;i<${#arr[@]};i++))
do
        echo ${arr[i]}
done


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值