广工 AnyviewC 数据结构习题 第三章

广工 AnyviewC 数据结构习题 第三章

1【题目】试以顺序表L的L.rcd[L.length+1]作为监视哨,

改写教材3.2节中给出的升序直接插入排序算法。
顺序表的类型RcdSqList定义如下:

typedef struct {
   KeyType key; 
   ... 
} RcdType;
typedef struct {
   RcdType rcd[MAXSIZE+1]; // rcd[0]闲置
   int length;
} RcdSqList;
**********/
void InsertSort(RcdSqList &L)
{
    int i, j,len = L.length;
	for (i = 0; i < L.length; i++)
	{
		if (L.rcd[i + 1].key < L.rcd[i].key)
		{
			L.rcd[len] = L.rcd[i + 1];
			j = i + 1;

			do
			{
				j--;
				L.rcd[j + 1] = L.rcd[j];

			} while (L.rcd[len].key < L.rcd[j - 1].key);
			L.rcd[j] = L.rcd[len];
		}
	}
}

/**********

2 【题目】如下所述,改写教材1.3.2节例1-10的冒泡排序算法:

将算法中用以起控制作用的布尔变量change改为一个整型
变量,指示每一趟排序中进行交换的最后一个记录的位置,
并以它作为下一趟起泡排序循环终止的控制值。
顺序表的类型RcdSqList定义如下:

typedef struct {
   KeyType key; 
   ... 
} RcdType;
typedef struct {
   RcdType rcd[MAXSIZE+1]; // rcd[0]闲置
   int length;
} RcdSqList;
**********/
void BubbleSort(RcdSqList &L)
/* 元素比较和交换必须调用如下定义的比较函数和交换函数:*/
/* Status LT(RedType a, RedType b);   比较:"<"        */
/* Status GT(RedType a, RedType b);   比较:">"        */
/* void Swap(RedType &a, RedType &b); 交换             */
{
int change,i,j;
    int n = L.length;
    change = 0;
    for (i = n ; i > 1; --i)
    {
        if (change)
        {
            i = change;
            change = 0;
        }    
        for (j = 1; j < i  ; j++)
        {
            if (GT(L.rcd[j], L.rcd[j+1]))
            {
                Swap(L.rcd[j],L.rcd[j+1]);
                change = j;
                //printf("change = %d\n",change);
            }   
            //chenge++; 
        }
        
        if (change == 0)
            break;
       
    }
}

/**********

3【题目】已知记录序列L.rcd[1…L.length]中的关键

字各不相同,可按如下所述实现计数排序:另设数组
c[1…n],对每个记录a[i], 统计序列中关键字比它
小的记录个数存于c[i],则c[i]=0的记录必为关键字
最小的记录,然后依c[i]值的大小对序列中记录进行
重新排列。试编写算法实现上述排序方法。
顺序表的类型RcdSqList定义如下:

typedef struct {
   KeyType key; 
   ... 
} RcdType;
typedef struct {
   RcdType rcd[MAXSIZE+1]; // rcd[0]闲置
   int     length;
} RcdSqList;
**********/
void CountSort(RcdSqList &L)
/* 采用顺序表存储结构,在函数内自行定义计数数组c */
{
    RcdType L0[MAXSIZE + 1];
    //L0 = (RcdSqList*)  malloc  (sizeof(RcdSqList));
    int c[MAXSIZE + 1] = {0};
    int n = L.length;
    int i,j;
    RcdType temp;
    for (i = 1;i <= n;++i)
    {
        for (j = 1;j <= n;++j)
            if (L.rcd[i].key > L.rcd[j].key)
                c[i]++;
        //printf("i = %d, c[i] = %d\n",i,c[i]);
    }

    for (i = 1;i <= n; ++i)
    {
        L0[i] = L.rcd[i];        
    }
    
     for (i = 1;i <= n; ++i)
     {
        L.rcd[c[i]+1] = L0[i];
     }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值