给定一个无序单链表头节点head,实现单链表的选择排序,要求:额外空间复杂度为O(1)



如题,在QQ群上有人提出这个如何解决,对空间复杂度概念不是特别熟悉,网搜了下,简单理解为尽可能不使用递归而且辅助空间不随问题输入规模而改变,虽然欠妥,但暂时先这样吧。给定的是头节点head,则第一个节点应是head->next,以下无检查错误等代码,实现基本的选择排序功能。


/*
*	
*	SelectSort the LinkList according to the head node,
*	Require Space Complexity : O(1)
*	By Snow Yong
*	2015.11.08
*
*/

#include 
#include 
#include 
#include 

//data structure define
typedef int element;
typedef struct Lnode
{
	element data;
	struct Lnode *next;
}Lnode, *LinkList;


//LinkList SelectSort Style
int LinkListSelectSort(LinkList head)
{
	element temp;
	LinkList q, r, p = head->next;
	
	while (p != NULL)
	{
		r = p;/*r means the minimum position of data*/
		q = p->next;
		while (q != NULL)
		{
			if (r->data > q->data)
			{
				r = q;
			}
			q = q->next;
		}
		if (r != p)
		{
			temp = p->data;
			p->data = r->data;
			r->data = temp;
		}/*Swap element*/
		p = p->next;
	}
}

//LinkList Create(using rand)
int CreateLinkList(LinkList *L, int n)
{
	int i;
	(*L)->next = NULL;
	srand(time(0));
	
	for (i = 0; i < n; i++)
	{
		LinkList p = (LinkList)malloc(sizeof(Lnode));
		p->data = rand()%100 + 1;
		p->next = (*L)->next;
		(*L)->next = p;
	}
}


//Print LinkList
int PrintLinkList(LinkList L)
{
	LinkList p = L->next;
	while (p != NULL)
	{
		printf("%d--", p->data);
		p = p->next;
	}
}

int main()
{
	LinkList L = (LinkList)malloc(sizeof(Lnode));
	CreateLinkList(&L, 10);
	
	printf("Before sorting: ");
	PrintLinkList(L);
	puts("\n");
	
	printf("After sorting:  ");
	LinkListSelectSort(L);
	PrintLinkList(L);
	return 0;
}

给定一个无序单链表头节点head,实现单链表的选择排序,要求:额外空间复杂度为O(1)_第1张图片



你可能感兴趣的:(数据结构&常用算法,C语言)