数据结构之插入排序

来源:互联网 发布:数据库 文件系统 编辑:程序博客网 时间:2024/06/05 09:39

1 、插入排序的详解

     从第二个数字开始插入在之前的有有序系列中,直到末尾。

     比如有个数组 int a[5] = {2, 5, 3, 1, 4};

     第 一次排序为:2, 5 ,3,1, 4

     第二次排序为: 2, 3, 5, 1, 4

     第三次排序为: 1, 2, 3, 5, 4

     第四次排序为: 1, 2, 3, 4, 5

2、代码实现

#include<stdio.h>void insert_sort(int *a, int length);void printf_int(int *a, int length);int main(){   int a[10] = {2, 5, 6, 7, 9, 1, 3, 4, 10, 9};   int length = sizeof(a)/sizeof(a[0]);   int b[4]  = {2, 5, 3, 1};   int length1 = sizeof(b)/sizeof(b[0]);   printf("length1 is %d\n", length1);   insert_sort(a, length);   printf_int(a, length);   insert_sort(b, length1);   printf_int(b, length1);   return 0;}void insert_sort(int *a, int length){   for (int i = 1; i < length; i++)   {       int last = a[i];       int j = i-1;       while(j >= 0 && a[j] > last) {       /*注意向后移动不是j++,是j+1,以后不要搞错了*/           a[j + 1] = a[j];           j--;/*要得--,不然死循*/       }       a[j + 1] = last;   }}void printf_int(int *a, int length){   for (int i = 0; i < length; i++ )   {       printf("%d\t", a[i]);   }   printf("\n");}

3、展示结果

length1 is 4123456799101235

4、总结

     1 、需要知道第一次循环是数组长度减1

     2、我们要记得在插入数据和之前数据的关系,插入数据之前的数据坐标是插入数据的坐标减一,不要在从新定义下表,增加复杂性,能关联就关联

     3、然后我们需要找到循环的条件,即插入的数据和之前的数据进行对比,当然下表必须大于0

     4、要记得j--,不然就是死循环了

     5、用的比较巧妙,如果不进入循环,我们对数据不做处理,先得到插入数据last 然后j = i -1;然后最后又是a[j + 1]这样数据就复原了,切忌。

0 0