注册 登录
编程论坛 数据结构与算法

直接插入法排序

ldsh304 发布于 2016-04-20 16:24, 3452 次点击
程序代码:
# include <stdio.h>
# define MAXSIZE 20

typedef int KeyType;
typedef char InfoType;
typedef struct
{
    KeyType key;    //关键字
    InfoType otherinfo;
}RcdType;
typedef struct
{
    RcdType r[MAXSIZE + 1];
    int length;
}Sqlist;

Sqlist input(Sqlist L)//输入元素
{
    printf("请输入所需数字元素的个数:");
    scanf("%d", &L.length);
    printf("请输入元素:");
    for (int i = 1; i <= L.length; i++)//L.r[0] 暂存 L.r[i+1] 数据
        scanf("%d", &L.r[i].key);
    return L;
}
void print(Sqlist L)//输出元素
{
    for (int i = 1; i <= L.length; i++)
        printf("%-5d" , L.r[i].key);
    printf("\n") ;
}

void InsertSort(Sqlist L)//改变后的直接插入法
{
    int i, j;
    for (i = 1; i <= L.length; i++)
        if (L.r[i+1].key < L.r[i].key)
        {
            L.r[0] = L.r[i+1];//L.r[0]暂存数据
            for (j = i; L.r[0].key < L.r[j].key; --j)
                L.r[j+1] = L.r[j];//后移数据
            L.r[j+1] = L.r[0]; //插入数据
        }
    printf("直接插入法 排序后的表的元素为:");
    print(L);
}
int main()
{
    Sqlist L;
    L = input(L);
    printf("原表的元素为:");
    print(L);
   
    InsertSort(L);

   
    return 0;
}

void InsertSort(Sqlist L)//直接插入法
{
    int i, j;
    for (i = 2; i <= L.length; i++)
        if (L.r[i].key < L.r[i-1].key)
        {
            L.r[0] = L.r[i];//L.r[0]暂存数据
            for (j = i-1; L.r[0].key < L.r[j].key; --j)
                L.r[j+1] = L.r[j];//后移数据
            L.r[j+1] = L.r[0]; //插入数据
        }
    printf("直接插入法 排序后的表的元素为:");
    print(L);
}

改变后的直接插入法  是根据红色的代码改变的
当输入L.length为6时; 排序没有问题
********************************************************************
原表的元素为:1    6    2    5    3    4
直接插入法 排序后的表的元素为:1    2    3    4    5    6
********************************************************************

当输入L.length为7时; 排序就有问题
********************************************************************
原表的元素为:1    7    2    6    3    5    4
直接插入法 排序后的表的元素为:0    1    2    3    4    5    6
********************************************************************
请问为啥会出现这种情况,代码怎样改才对?


[此贴子已经被作者于2016-4-20 16:29编辑过]

2 回复
#2
azzbcc2016-04-21 11:24
红色代码没问题,原来代码错在数组越界

改成这样就行了

for (i = 1; i < L.length; i++)
#3
ldsh3042016-04-22 22:48
回复 2楼 azzbcc
虽然已解决,但是谢谢了
1