以链表和数组实现并归排序的区别

本文探讨了使用链表和数组分别实现归并排序时的效率差异。通过对比,发现链表形式的归并排序在处理大量数据时表现出更好的时间性能,其运行时间为27ms,而数组形式则为32ms。主要原因是数组在排序过程中需要进行数据拷贝,产生了额外的O(N)时间复杂度。
摘要由CSDN通过智能技术生成

数组形式:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//
void merge(int start,int end,int nums[],int temps[]){
	int flag1=0,flag2=0,mid=0,pos=0,i=0;
	if(start>=end-1){
		return;
	}else{
		mid=(start+end)/2;
		merge(start,mid,nums,temps);
		merge(mid,end,nums,temps);
	}
	pos=flag1=start;
	flag2=mid;
	while(flag1<mid&&flag2<end){
		if(nums[flag1]<nums[flag2]){
			temps[pos++]=nums[flag1++];
		}else{
			temps[pos++]=nums[flag2++];
		}
	}
	if(flag1<mid){
		for(;flag1<mid;flag1++){
			temps[pos++]=nums[flag1];
		}
	}
	if(flag2<end){
		for(;flag2<end;flag2++){
			temps[pos++]=nums[flag2];
		}
	}
	for(i=start;i<end;i++){
		nums[i]=temps[i];
	}
}
int main(){
	int nums[109120],len=sizeof(nums)/sizeof(nums[0]),temps[109120],i=0,start=0,finish=0;
	for(i=0;i<len;i++){
		nums[i]=109120-i;
	}
	start=clock();
	merge(0,len,nums,temps);
	finish=clock();
	printf("\n%d\n",finish-start);
	printf("array\n");
	for(i=0;i<len;i++){
		//printf("%d\n",nums[i]);
	}
   
	
}


链表形式:排序的思路和用数组形式时一样

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct Node{
	int e;
	struct Node *next;
}Node;
//start 表示开始位置 end 表示结束位置 origin 表示第一段开始位置的起点 nums  用来获得第二段开始位置的起点 
Node* merge(int start,int end,Node *origin,Node *nums){

	int mid=0,flag1=0,flag2=0,first=0;//first作为一个标识(处理一个特殊情况)
	Node *last=origin,*start1=NULL,*start2=NULL,*head=origin;
	if(start>=end-1){
		return origin;
	}else{
		mid=(start+end)/2;
		start1=merge(start,mid,origin,nums);
		start2=merge(mid,end,&nums[mid],nums);
	}

	flag1=start;
	flag2=mid;
	//falg1,2用来指定需要插入数据的数量
	while(flag1<mid&&flag2<end){
		if(start1->e>start2->e){
			//如果在合并第一个数时,第二段的数较小,将小的插到第一组数前,并使start1指向小的,以防继续向前插入
			if(flag1==start&&first==0){
				last=start2;
				start2=start2->next;
				last->next=start1;
				head=last;
				start1=last;
				flag1--;
				flag2++;
				first++;
				continue;
			}
			last->next=start2;
			start2=start2->next;
			last->next->next=start1;
			flag2++;
			last=last->next;
			continue;
		}
		flag1++;
		last=start1;
		start1=start1->next;
	}
	if(flag1<mid){
	}
	if(flag2<end){
		last->next=start2;
	}
	return head;
}
int main(){
	Node *head=NULL,node[109120],*temp,*last;
	int i=0,len=0,start=0,finish=0;
	len=sizeof(node)/sizeof(node[0]);
	last=head=node;
	for(i=0;i<len;i++){
		if(i>0){
			last->next=&node[i];
			last=&node[i];
		}
		node[i].e=len-i;
	}
	head=node;
	start=clock();
	head=merge(0,len,head,node);
	temp=head;
	finish=clock();
	printf("\n%d\n",finish-start);
	printf("list");
	for(i=0;i<len;i++){
		//printf("%d\n",temp->e);
		temp=temp->next;
	}
	
}


运行的结果:链表的形式较快(27ms)数组的形式较慢(32ms),证明在排序大量数据时,链表的时间性能较好,因为数组需要将一个数组的数据拷贝到另一个数组,这需要花费O(N)时间







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值