常用排序算法之插入排序

32 篇文章 2 订阅
8 篇文章 0 订阅

1.“插入”的来源

所谓的“插入”,类似于我们玩扑克牌时候,将扑克牌插入到合适位置的过程。(除过J、Q、K、A)

2.算法思想

     假定我们的牌只有1张时,认为该牌组的牌序是有序的。(5,1,4,2,3)

       那么,我们就可以将我们的一组牌分为左右两组了,起始情况下:

          1)左边牌组:5

          2)右边牌组:1,4,2,3

       好了,左边牌序根据我们的假设,它已经是有序的。

第一次插入,

       我们从右边牌组中只取第一张牌(1)插入到左边牌组的合适位置。   

         1)左边牌组:1,5

         2)右边牌组:4,2,3

第二次插入,
       我们从右边牌组中依然只取第一张牌(4)插入到左边牌组的合适位置。

         1)左边牌组:1,4,5

         2)右边牌组:2,3 

第三次插入,

       我们从右边牌组中只取第一张牌(2)插入到左边牌组的合适位置。   

         1)左边牌组:1,2,4,5

         2)右边牌组:3

第四次插入,
       我们从右边牌组中依然只取第一张牌(3)插入到左边牌组的合适位置。

         1)左边牌组:1,2,3,4,5

         2)右边牌组:

3.核心代码

    1) 每次只取右边牌组第一个数

     

a[0]=a[i];		//待插入点为a[0] ,假设a[1]是已经排好序的 


    2)  从后往前寻找合适点进行插入

for(j=i;j>1;j--){
			if(a[j-1]<a[0]){
				break;
			}
			a[j] = a[j-1];
}

    3)  将待插点插入到合适点

a[j]=a[0];   //a[0]是待插点,a[j]是合适点 


4.完整代码

#include <stdio.h>
#define N 100

void insert(int *a,int n){
	int i,j;
	for(i=2;i<=n;i++){
		
		a[0]=a[i];		//待插入点为a[0] ,假设a[1]是已经排好序的 
		
		for(j=i;j>1;j--){
			if(a[j-1]<a[0]){
				break;
			}
			a[j] = a[j-1];
		} 
		a[j]=a[0];
	}
}

int main(void){
	
	int n=5;
	//scanf("%d",&n);
	int a[N]={-1,5,3,1,2,4}; //a[0]是一个存放待插点的位置 
	
	insert(a,n);
	int i=1;
	for(;i<=n;i++){
		printf("%-5d",a[i]);
	}
	
	
	return 0;
	
}
 


5.运行结果


       我们每次从右边牌组中 只取第一张牌(1) 插入到左边牌组的合适位置。

         1)左边牌组:1,5

         2)右边牌组:4,2,3

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值