动态数组排序

一个好的算法往往依赖于一个合理的数据结构

在很多情况下排序问题是不知道排序数据的个数的,通常的做法是

(1)建立一个空间很大的数组,保证空间够用,但是这样会造成很大的浪费

(2)在知道数组个数的情况下可以用malloc函数来分配数组个数是个变量的情况,但是在个数未知时就不能实现了

(3)利用链表实现动态的数组,这样不管数组的长度是多少都可以进行存储和排序了

下面通过冒泡排序来理解一下动态数组的排序,同时可以应用到其他的排序方法中

实现代码如下:

#include 
#include 
#include 

//定义一个链表结构体
typedef struct node 
{
	int data;
	struct node *next;
}LNode,*LinkList;

//创建链表
LinkList createLinkList()
{
	LinkList list = NULL;
	int temp;

	scanf("%d",&temp);
	list = (LinkList)malloc(sizeof(LNode));
	if(!list)
	{
		exit(0);
	}
	list->data = temp;
	list->next = NULL;
	return list;
}

//插入
void insertList(LinkList q,int temp)
{
	LinkList p;
	p = (LinkList)malloc(sizeof(LNode));
	if(!p)
	{
		exit(0);
	}
	p->data = temp;
	if(!q)
	{
		q = p;
		p->next=NULL;
	}
	else
	{
		p->next=q->next;
		q->next=p;
	}
}

/*动态数组排序
*此处用冒泡来说明动态数组排序的思想,以后可以自行移植到其他的排序中去
*/
void DynamicSort(LinkList q)
{
	LNode *p = q;
	int len=0,temp;
	//首先计算数组的长度
	while(p)
	{
		len++;
		p=p->next;
	}
	
	for(int i=len-1; i>0; i--)
	{
		p=q;
		for(int j=0; jdata > p->next->data)
			{//交换
				temp=p->data;
				p->data = p->next->data;
				p->next->data = temp;
			}
			p=p->next;
		}
	}


}

//输出所有的链表
void display(LinkList list)
{
	LinkList q=list;
	while(q)
	{
		printf("%d\t",q->data);
		q = q->next;
	}
	printf("\n");
}

void main()
{
	printf("请输入一组数,以-1结尾:\n");
	LinkList list = createLinkList();

	int temp;
	scanf("%d",&temp);
	while(temp != -1)
	{
		insertList(list,temp);
		scanf("%d",&temp);
	}
	display(list);
	DynamicSort(list);
	display(list);

}



 

你可能感兴趣的:(算法之经典数据结构问题)