1052 Linked List Sorting (25分)(用冒泡排序法对链表排序)

陈姥姥提过可以用冒泡法对链表进行排序,这个题就试着用冒泡排序法做了一下。很显然算法本身是可以的,但是冒泡排序是一个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;
}

猜你喜欢

转载自blog.csdn.net/yiwaite/article/details/105491922
今日推荐