直接插入排序思想
直接插入排序思想过程可以理解为现在你手里有一沓钱,钱有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
插入排序时间复杂度
- 我们首先看最坏的情况就是整个序列都是逆序的,则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)
- 我们再来看最好的情况就是整个序列一直是有序的,那么while循环中的temp<R[j]不成立,那么就是单层for循环。所以时间复杂度为O(n)