排序(一)

一、插入类排序

     基本思想:

            在一个已排好序的记录子集的基础上,每一步将下一个待排序的记录有序插入到已排好序的记录子集中,

            直到将所有待排记录全部插入为止。

    (1)直接插入排序

            ***思想

                将第i个记录的关键字Ki,依次与前面的i-1个记录的关键字进行比较,将所有关键字大于ki的记录依次向后移动

                一个位置,直到遇到一个关键字小于或等于Ki的记录,此时该记录后面必为空位置,将第i个记录插入到空位置即可。

                完整的直接插入排序是从i = 2开始的,也就是说,将第一个记录视为已排好序的单元素子集合,然后将第二个记录

                插入到单元素子集合中。

            ***算法

                void InsSort(RecordType r[],int length)

                {

                        for(int i = 2;i<=length;i++)        //直接插入排序是从i= 2开始的

                        {

                                r[0] = r[i] ;       //设置监视哨

                                j = i-1;

                                while(r[0].key < r[j].key)        //寻找插入位置

                                {

                                        r[j+1] = r[j] ;

                                        j -= 1;

                                }

                                r[j+1] = r[0] ;        //将待插入的记录插入到已排序的序列中

                        }

                }

            ***要点

                》》》使用监视哨r[0]临时保存待插入的记录

                》》》从后向前查找应插入的位置

                》》》查找和移动在同一循环中完成

            ***案例

                #include<stdio.h>
                #include<stdlib.h>
                typedef int KeyType;
                typedef int OtherType;
                typedef struct _RecordType
                {
                KeyType key;
                OtherType other_data;
                }RecordType;
                void InsSort(RecordType r[],int length)
                {
                int i,j;
                for(i = 2;i<=length;i++)
                {
                r[0] = r[i];
                j = i-1;
                while(r[0].key < r[j].key)
                 {
                r[j+1] = r[j];
                j -= 1;
                }
                r[j+1] = r[0];
                }
                }
                int main()
                {
                RecordType r[20];
                int len;
                int i;
                printf("请输入数组的长度\n:");
                scanf("%d",&len);
                for(i = 1;i<=len;i++)
                {
                 printf("请输入数组的第%d个元素",i);
                 scanf("%d",&r[i].key);
                 }
                printf("\n");
                printf("排序前的结果:\n");
                for(i = 1;i<=len;i++)
                {
                printf("%d",r[i].key);
                }
                printf("\n");
                InsSort(r,len);
                printf("排序后的结果:\n");
                for(i = 1;i<=len;i++)
                {
                 printf("%d",r[i].key);
                }
                printf("\n");
                return 0;
                }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值