23.10.31 彭波数据结构第九章习题 算法设计

1.试设计一个算法:对给定的序号j(1<j<n),在无序记录r[1...n]中找到按关键字从小到大排在第j位上的记录,要求利用快速排序的划分思想实现上述查找。

void Findj_Sort(SqList &L,int j){
	int n=L.length;
	cout<<"第j个有序记录是:"<<ifmidj(L,1,n,j)<<endl;
} 
int ifmidj(SqList L,int low,int high,int j){
	if(low<high){
		int mid=Partition(L,low,high);
		if(mid==j) return L.r[mid].key;
		else if(mid>j) 
			return ifmidj(L,low,mid-1,j);
		else
			return ifmidj(L,mid+1,high,j);
	}
}

2.试设计一个算法:己知{k1,k2,⋯,kn}是一个堆,要求删除其中一个记录结点,删除后还是堆。提示:先将L.r[i]和堆中最后一个元素交换,并将堆长度减1;再从位置i开始向下调整,使其满足堆性质。

void DeleteHeap(SqList &L,int i){
	L.r[0]=L.r[i];
	L.r[i]=L.r[L.length];
	L.r[L.length]=L.r[0];
	L.length--;
	L.r[0]=L.r[i];
	for(int j=i*2;j<L.length;j*=2){
		if((j<L.length)&&(L.r[j].key<L.r[j+1].key))
			j++;
		if(L.r[0].key>=L.r[j].key) break;
		L.r[i]=L.r[j];
		i=j;	
	}
	L.r[i]=L.r[0];
}

3.对于记录序列r[1….n],可以按照如下方法实现奇偶交换排序:第一趟对所有奇数i,将r[i]和r[i+1]进行比较,第二趟对所有偶数i,将r[i]和r[i+1]进行比较;每次比较时如果r[i]>r[i+1]了,则将二者交换,然后重复上述排序过程,直至整个数组有序。试设计一个算法,根据上述思想实现奇偶交换排序。

void OddEvenSort(SqList &L){
	for(int i=1;i<L.length;i+=2){
		if(L.r[i].key>L.r[i+1].key){
			L.r[0]=L.r[i];
			L.r[i]=L.r[i+1];
			L.r[i+1]=L.r[0];
		}	
	}
	for(int i=2;i<L.length;i+=2){
		if(L.r[i].key>L.r[i+1].key){
			L.r[0]=L.r[i];
			L.r[i]=L.r[i+1];
			L.r[i+1]=L.r[0];
		}
	}
	if(!ifsure(L)) OddEvenSort(L);
}//可以尝试设计一个外部循环,而非递归 
int ifsure(SqList &L){
	for(int i=1;i<L.length;i++){
		if(L.r[i].key<L.r[i+1].key)
			return 0;
	}
	return 1;
} 

4.已知记录序列r[1...n]中关键字各不相同,可以按照如下方法实现计数排序:另设一个数组count[1]~count[n],对每个记录r[i]统计序列中关键宇比它小的记录个数 count[i],则count[i]=0 的记录必为关键字最小的记录,count[i]=1的记录必为关键字次小的记录;以此类推,即按count[i]值的大小对记录序列r[1...n]中记录进行重新排列。试设计一个算法,根据上述思想实现计数排序。

void CountSort(SqList &L){
	int count[L.length+1]
	for(int i=1;i<=L.length;i++){
		L.r[0]=L.r[i];
		count[i]=0;
		for(int j=1;j<=L.length;j++)
			if(L.r[j].key<L.r[i].key) count[i]++;
	}
	RedType a[L.length+1];
	for(int i=1;i<=L.length;i++)
		a[count[i]+1]=L.r[i];
	for(int i=1;i<=L.length;i++)
		L.r[i]=a[i];
}//我觉得这样太麻烦了,还在想改进的方法

5.荷兰国旗问题。要求重新排列一个由字行 R、W和B(R 代表红色,w 代表白色,B
代表蓝色,这都是荷兰国旗的颜色)构成的数组,使得所有的R都排在最前面,W 排在其次,
B排在最后。试为荷兰国旗问题设计一个算法,其时间复杂度是 O(n)。

void DutchFlagSort(SqList &L){
	int r=0,w=0,b=0;
	int i;
	for(i=1;i<=L.length;i++){
		if(L.r[i].key==R) r++;
		else if(L.r[i].key==W) w++;
		else b++;
	}
	for(i=1;i<=r;i++) L.r[i]=R;
	for(i=r+1;i<=r+w;i++) L.r[i]=W;
	for(i=r+w+1;i<=L.length;i++) L.r[i]=B;
} 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值