您的位置:首页 > 其它

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

2017-07-15 16:14 316 查看
数组形式:

#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)时间
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: