直接插入排序、希尔排序—C—Python

1、直接插入排序
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为 O(n^2),是稳定的排序方法,性能优于冒泡和简单选择排序

C实现

#include <stdio.h>
int n, arr[100];
void insertSort(int * arr)
{
    int i,j,key;
    for(i=2;i<=n;i++)
    {
        key=arr[i];
        j=i-1;
        while(j>=0&&arr[j]>key)
        {
            arr[j+1]=arr[j];
            j--;
        }
        arr[j+1]=key;
    }
}

int main(int argc,char * argv[])
{
    int i;
     scanf("%d",&n);
     for(i=1;i<=n;i++)
         scanf("%d",&arr[i]);
    insertSort(arr);
    for(i=1;i<=n;i++)
        printf("%d ",arr[i]);
    printf("\n");
    return 0;
}

python 实现

#直接插入排序
def insert_sort(lists):
    n=len(lists)
    for i in range(1,n):
        key=lists[i]
        j=i-1
        while(j>=0 and lists[j]>key):
            lists[j+1]=lists[j]
            j-=1
        lists[j+1]=key
if __name__=='__main__':
    eles = input('intput elements:').strip().split()
    list = [int(ele) for ele in eles]
    insert_sort(list)
    print(list)

2、希尔排序
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
思想:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的。

C实现

#include <stdio.h>
void shellSort(int arr[],int n)
{
    int i,j,step,key,k;
    for(step=n/2;step>0;step/=2)         //分组,增量逐渐减小,即分组逐渐减少
    {
        for(i=1;i<=step;i++)              //分成的子组分别进行直接插入操作
            for(j=step+i;j<=n;j+=step)
            {
                key=arr[j];
                k=j-step;
                while(k>0&&arr[k]>key)
                {
                    arr[k+step]=arr[k];
                    k-=step;
                }
                arr[k+step]=key;
            }
    }
}

int main()
{
     int i,n, arr[100];
     scanf("%d",&n);
     for(i=1;i<=n;i++)
         scanf("%d",&arr[i]);
     shellSort(arr,n);
     for(i=1;i<=n;i++)
        printf("%d ",arr[i]);
     printf("\n");
     return 0;
}

python 实现

def shell_sort(lists):
    n=len(lists)
    gap=n//2
    while gap>0:
        for i in range(gap):
            for j in range(i+gap,n,gap):
                key = lists[j]
                k=j-gap
                while k>=0 and lists[k]>key:
                    lists[k+gap]=lists[k]
                    k-=gap
                lists[k+gap]=key
        gap//=2
    return lists

if __name__=='__main__':
    eles = input('intput elements:').strip().split()
    list = [int(ele) for ele in eles]
    list=shell_sort(list)
    print(list)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值