标题:直接插入法排序
只看楼主
ldsh304
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:242
专家分:755
注 册:2016-1-18
结帖率:100%
已结贴  问题点数:9 回复次数:2 
直接插入法排序
程序代码:
# 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编辑过]

搜索更多相关主题的帖子: 插入法 
2016-04-20 16:24
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:9 
红色代码没问题,原来代码错在数组越界

改成这样就行了

for (i = 1; i < L.length; i++)


[fly]存在即是合理[/fly]
2016-04-21 11:24
ldsh304
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:242
专家分:755
注 册:2016-1-18
得分:0 
回复 2楼 azzbcc
虽然已解决,但是谢谢了
2016-04-22 22:48



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-463892-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.053663 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved