插入类排序——直接插入排序

直接插入排序思想

直接插入排序思想过程可以理解为现在你手里有一沓钱,钱有5毛的,1块的,5块的,10块的,20块的,50块的,100块的。根据我的习惯,喜欢把钱按照纸币面积大小放好,所以100的肯定在下面把其他面额的钱包起来放在口袋里。但是现在我们手里的一沓钱是乱序的,不按照纸张面积大小排放,所以我们现在要把这些钱排序放好。
第一张默认已经排好了。第二张钱的面值与第一张比较,如果大于第一张则位置不动,如果小于第一张则拿出来插入原本第一张钱的前面。第三张钱的面值与第二张比较如果小于则插入其前面,再与第一张比较如果小于则再次插入前面。第四张再次像前几步那样比较,第五张第六张第七张也是。需要注意的是每次比较都要到第一张钱,也就是说一张钱确定其位置的过程中可能有多次“插入”的过程。

直接插入排序代码实现

#include<stdio.h>
void insertSort(int *R,int n);
int main(void){
 int arr[8]={49,38,65,97,76,13,27,40};
 int i;
 printf
 for(i = 0;i <8; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
    insertSort(arr,8); 
 for(i = 0 ;i < 8; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
} 
//插入排序函数
void insertSort(int *R,int n){
 int i,j;
 int temp;
 int r[n];
 for(i=1;i<n;++i)
 {
  temp=R[i];
  j=i-1;
  while(j>=0&&temp<R[j])
  {
   R[j+1]=R[j];
   --j; 
  }
  R[j+1]=temp;
 }
}

插入排序代码解释

原始序列:49 38 65 97 76 13 27 40
1)—开始只看第一个数49当然是有序的.
49 38 65 97 76 13 27 40
2)插入第二个数38。 38<49。所以49向后移动一个位置,38插入到49原来的位霣,这次排序后的结果为:
38 49 65 97 76 13 27 40
3)插入65, 65>49,所以不而要移动,65就应该在49之后,这次排序后的结果为:
38 49 65 97 76 13 27 40
4)插入97, 97>65,所以不需要移动,97就应该在65之后,这次排序后的结果为:
38 49 65 97 76 13 27 40
5)插入76, 76<97,所以97向后移动一个位置:继续比较,76>65, 65不需要移动,76应该插入
在65之后、97之前,这趙烊序后的结果为:
38 49 65 76 97 13 27 40
6)插入13,13<97, 97后移:丨3<76, 76后移:这样逐个向前比较,发现13应该插入在最前面,
这次排序后的结果为:
13 38 49 65 76 97 27 40
7)插入27,还是从后向前进行比较,确定27应该插入在13之后、38之前,这次排序后的结果为:
13 27 38 49 65 76 97 40
8)最后插入40,同样从后向前逐个比较,直到38<40<49,它的位置确定,直接插入排序全过程完成。
最后的排序结果为:
13 27 38 40 49 65 76 97

插入排序时间复杂度

  1. 我们首先看最坏的情况就是整个序列都是逆序的,则while循环中temp<R[j]条件始终成立。此时while循环中的循环次数达到最大值,可以循环i次,如:当i=7时while循环j值从0取到6,可以执行7次。而i的取值为从1到n-1所以总共执行次数为1+2+3+4+5+…+n-1=n*(n-1)/2所以此时时间复杂度为O(n^2)
  2. 我们再来看最好的情况就是整个序列一直是有序的,那么while循环中的temp<R[j]不成立,那么就是单层for循环。所以时间复杂度为O(n)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值