插入排序算法

1、算法思想

 举例:相信大家应该都斗过地主,斗地主的是时候,我们从摸牌开始,是不是从第二张牌开始,我们就需要让它跟前面的牌比较,看谁大或者谁小,我们会把这张牌放到合适的位置,当整个摸牌结束时,我们手中牌就已经是一个有顺序的组合了。

插入算法的思想说实话跟这个基本一样。我们把第一个元素看作基准值,让后面的第二个元素与它进行比较(这里按照从大到小的方式进行),如果比第一个元素大,就放到它后面,反之放到它的前面;然后第三个元素又与前面两个元素比较,并放到合适的位置,后面的元素依次类推。

2、算法实现

有了上面的思想,那我们怎么实现呢

第一步:我们把每次的待排元素拿出来放到一个空间中去,他本来的那个位置就空出来了,我们来判断这个待排元素与它前面一个已经排好顺序的元素的大小

第二步:比较大小后,如果比它大,那这个元素就放在原地不动,如果比它小,我们就让它前面已经排好序的最后一个元素后移一次,占据它走之后的那个剩余的空间,接着再比较排好序的倒数第二个元素,也是如此的操作,直到找到不比它大的元素。

3、代码

#include<stdio.h>
#include<time.h>

#define LENGTH 10

//插入排序
void insersort(int *__src,int length)//参数(原数组,数组长度或元素个数)
{
     int i,j;
     int temp;//定义一个变量来接收待排元素
     for(i=1;i<length;i++)//外层循环,从第二个元素开始
     {
        temp = __src[i];//待排元素
        for(j=i-1;j>=0;j--)//内层循环,从待排元素的前一个元素开始,也就是排序好元素的最后一个元素
        {
            if(temp >= __src[j])//如果待排元素大于等于前一个元素,跳出内层循环,下一个元素继续
                break;
            __src[j+1] = __src[j];//如果小于前一个元素,我们让前一个元素后移,再次进入循环比较直到待排元素大于等于前面的一个元素
        }
        __src[j+1] = temp;//插入待排元素
     }
}

//利用随机数产生数组
void produce_arr(int *__src,int length)
{
    srand(time(NULL));
    for(int i = 0;i<length;i++)
        __src[i] = rand()%100;
}

//输出数组中的所有元素
void traversal_arr(int *__src,int length)
{
    for (int i = 0; i < length; i++)
    {
        printf("%d ",__src[i]);
    }
    printf("\n");
}

int main()
{
    int arr[LENGTH];
    produce_arr(arr,LENGTH);//产生数组
    printf("the original array is:\n");
    traversal_arr(arr,LENGTH);//输出数组中的所有元素
    insersort(arr,LENGTH);//插入排序
    printf("after the insertsort is:\n");
    traversal_arr(arr,LENGTH);
    return 0;
}

运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值