给定一个无序单链表头节点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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

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





  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值