这道题写第一遍写的比较乱,有几个测试无法通过,就重写了,现在也不知道刚刚啥bug了,简单题,应该就是逻辑不严谨吧,小问题。
#include <stdio.h>
#define FALSE 0
#define TRUE 1
typedef int bool;
typedef struct{ //数据结构类型
bool cover; //被覆盖的标志
int data; //数据值
}Node;
void Qsort(Node *n,int top,int end); //快速排序
int search(Node *node,int n,int e); //搜索数据值并返回数组下标
int main(void){
int n;
scanf("%d",&n);
Node node[n+1];
for(int i = 1;i <=n;i++){
scanf("%d",&node[i].data);
node[i].cover = FALSE; //作为验证是否被覆盖的标志
}
Qsort(node,1,n); //根据data快速非递增排序,从1到n位置
int temp;
for(int i = 1;i <=n;i++){
if(node[i].cover == FALSE){
temp = node[i].data;
while(temp>1){
if(temp%2 == 0){
temp = temp/2;
}else{
temp = (temp * 3 + 1)/2;
}
node[search(node,n,temp)].cover =TRUE;
}
}
}
int flag = 1; //输出为第一个数据
for(int i = 1;i <= n ; i++){
if(node[i].cover == FALSE){
if(flag == 1)printf("%d",node[i].data);
else printf(" %d",node[i].data);
flag = 0;
}
}
return 0;
}
int partition(Node *n,int low,int high){
n[0] = n[low];
int pivotvalue = n[low].data;
while(low<high){
while(low<high && n[high].data <pivotvalue)high--;
n[low] = n[high];
while(low<high && n[low].data >pivotvalue)low++;
n[high] = n[low];
}
n[low] = n[0];
return low;
}
void Qsort(Node *n,int low,int high){
if(low<high){ //内部元素大于一继续循环
int pivotkey = partition(n,low,high);
Qsort(n,low,pivotkey-1);
Qsort(n,pivotkey+1,high);
}
}
int search(Node *node,int n,int e){
for(int i = 1;i <=n;i++){
if(node[i].data ==e)return i;
}
return 0;
}
导师台上讲 产品形象识别,我就在下面听歌敲代码,也有点晕乎乎的,而且专教桌子矮板凳高,敲了两节课代码很难受,结果居然通过了,哈哈哈,很惊喜!
顺便说一句,严蔚敏版的数据结构内的代码真的是太整洁了,快排看一遍就记在心里,强烈推荐!!