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;
}