数据结构(五)之直接插入排序

下面是我的小小代码:

 1 /*
 2 直接插入排序的基本思想:每次将一个待排序的记录按其关键字的大小插入到前面已排好序的文件中的适当位置,
 3 
 4   直到全部记录插入完为止。
 5 
 6   直白一点对于一个数组而言,将数组分为两部分前一部分是已有序的,后一部分是无序的,排序的过程中,只
 7   
 8   需要每次从无序的部分中取第一个元素,把它插入到有序部分的适当位置,是有序部分不断地扩大,直到无序
 9 
10   部分为空,有序部分包含了所有数据。
11 */
12 
13 #include <stdio.h>
14 
15 void main(){
16    int array[2000];
17    int numberCount;
18    int i;
19    int j;
20    int comperCount=0;//注意有可能一次都不用比较,所以记录比较次数的变量要赋值
21 
22    printf("请为数组输入对应的数据(整型数)并且当输入-9999时结束输入的动作!\n\n   ");
23    for(i=1;i<2000;i++){//注意此处从1开始,0作为哨兵的位置
24       scanf("%d",&array[i]);
25       if(array[i]==-9999){break;}
26    }
27 
28    numberCount=i-1;
29    printf("\n\n数组中有效的数据有:%d 个!",numberCount);
30 
31    //这段代码是直接插入排序的核心,分内外两层循环,外层循环控制待插入数据的比较次数,内层循环控制
32    //为待插入的数据寻找合适的位置
33    for(i=2;i<=numberCount;i++){//注意此处从2开始,这是有直接插入排序的思想决定的
34        if(array[i]<array[i-1]){
35           array[0]=array[i];
36           j=i-1;
37           do{
38              array[j+1]=array[j];//注意此处的j+1千万不能写成j++,在编写中我就犯了这个错误
39              j--;
40              comperCount++;
41           }while(array[0]<array[j]);
42           array[j+1]=array[0];//为待插入的数据找到了合适的位置插入对应的位置
43        }
44    }
45 
46    printf("\n\n此数组经直接插入排序后的升序序列如下:\n\n   ");
47    for(i=1;i<=numberCount;i++){
48       printf("%d ",array[i]);
49    }
50 
51    printf("\n\n此数组经直接插入排序后的降序序列如下:\n\n   ");
52    for(i=numberCount;i>=1;i--){
53       printf("%d ",array[i]);
54    }
55 
56    printf("\n\n此数组经直接插入排序比较的次数为:%d 次!\n\n",comperCount);
57 }

     代码中注释已比较清楚的指出了直接插入排序的基本思想和编写代码要注意的一些地方,如果下次在看时应该非常容易理解整段代码的!

你可能感兴趣的:(数据结构)