陈姥姥提过可以用冒泡法对链表进行排序,这个题就试着用冒泡排序法做了一下。很显然算法本身是可以的,但是冒泡排序是一个n平方的算法所以实际上大数据测试是过不了的。要想拿满分就直接用stl做。
#include<cstdio>
struct Node{
int key;
int next;
bool flag;
Node(){
flag = false;
}
}node[100010];
int main()
{
int n,firstAdd;
int firstNode = 100000;
scanf("%d%d",&n,&firstAdd);
node[firstNode].next = firstAdd;
int i,address,key,next;
for(i=0; i<n; i++)
{
scanf("%d%d%d",&address,&key,&next);
node[address].key = key;
node[address].next = next;
node[address].flag = true;
}
int p=firstAdd,cnt=0;
if(node[p].flag==false){
printf("0 -1\n");
return 0;
}
while(p!=-1)
{
cnt++;
p=node[p].next;
}
int j,left,mid,right,cnt1;
for(i=cnt-1;i>=1;i--)
{
left = firstNode;
mid = node[firstNode].next;
right = node[mid].next;
cnt1 = 0;
bool flag = false;
while(cnt1<i)
{
cnt1++;//printf("cnt1=%d\n",cnt1);
if(node[mid].key>node[right].key)
{
//printf("%d %d交换\n",node[mid].key,node[right].key);
node[mid].next = node[right].next;
node[right].next = mid;
node[left].next = right;
left=right;
right = node[mid].next;
flag = true;
}
else
{
left = mid;
mid = right;
right = node[mid].next;
}
}
if(flag==false)break;
}
p=node[firstNode].next;
printf("%d %05d\n",cnt,p);
while(p!=-1)
{
printf("%05d %d ",p,node[p].key);
if(node[p].next==-1)printf("-1\n");
else printf("%05d\n",node[p].next);
p = node[p].next;
}
return 0;
}