直接插入法排序
程序代码:
# 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编辑过]