以链表和数组实现并归排序的区别
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)时间
#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)时间
相关文章推荐
- C语言链表中数组实现数据选择排序,升序、降序功能主要难点
- leetcode 将已排序的 数组/链表 转换为二叉搜索树(BST),Python实现
- 怎样编写一个程序,把一个有序整数数组放到二叉树中? 编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?
- 快速排序 Java实现-数组-链表
- 冒泡升序排序的数组实现和链表实现
- 归并排序--数组和链表的实现
- 用链表排序(数组的初级运用链表实现)
- Python中数组 链表 元组 字典实现类Sql多字段排序和动态函数实现
- C语言链表中数组实现数据选择排序,升序、降序功能主要难点
- 用折半查找法实现排序好的数组的查找(有重复记录)
- 链表与数组的区别
- 实现双链表的排序
- 【自编小代码】用链表实现对键盘的输入进行排序
- 用JavaScript实现json数组的排序功能
- Javascript 数组自定义排序,并获取排序后的保存原索引的同序数组(堆排序实现)
- php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
- 排序算法集:冒泡、插入、希尔、快速(数组实现、链表实现)
- C++实现队列--数组实现和链表实现
- php实现数组按拼音顺序排序的方法[原创]_php技巧_脚本之家
- 链表和数组的区别在哪里?