码迷,mamicode.com
首页 > 编程语言 > 详细

排序 - 归并排序

时间:2016-05-01 21:41:57      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:

没弄明白

#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXSIZE 10

//递归法 
void Merge(int *list1,int list1_size,int *list2,int list2_size){
	int i,j,k,m;
	int temp[MAXSIZE+1];
	i = j = k = 0;
	
	while(i<list1_size && j<list2_size){
		if(list1[i]<list2[j]){
			temp[k++] = list1[i++];
		}else{
			temp[k++] = list2[j++];
		}
	}
	while(i<list1_size){
		temp[k++] = list1[i++];
	}
	while(j<list2_size){
		temp[k++] = list2[j++];
	}
	for(m=0;m<list1_size+list2_size;m++){
		list1[m] = temp[m];
	}
}
void MergeSort(int k[],int n){
	if(n>1){
		int *list1 = k;
		int list1_size = n/2;
		int *list2 = k+n/2;
		int list2_size = n - list1_size;
		
		MergeSort(list1,list1_size);
		MergeSort(list2,list2_size);
		
		Merge(list1,list1_size,list2,list2_size);
	}
}

//非递归法 
void MergeSort2(int k[],int n){
	int i,left_min,left_max,right_min,right_max,next;
	int *temp = (int *)malloc(n*sizeof(int));
	
	for(i=1;i<n;i*=2){
		for(left_min = 0;left_min<n-i;left_min = right_max){
			right_min = left_max  = left_min + i;
			right_max = left_max + i;
			
			if(right_max>n){
				right_max = n;
			}
			
			next = 0;
			
			while(left_min<left_max && right_min<right_max){
				if(k[left_min]<k[right_min]){
					temp[next++] = k[left_min];
				}else{
					temp[next++] = k[right_min];
				}
			}
			while(left_min<left_max){
				k[--right_max] = k[--left_max];
			}
			while(next>0){
				k[--right_min] = temp[--next];
			}
		}
	}
}

int main(){
	int a[10] = {9,1,5,8,3,7,4,6,2,10};
	int i;

	MergeSort(a,10);
	
	for(i=0;i<10;i++){
		printf("%d  ",a[i]);
	}
	printf("\n");
	return 0;
}

  

排序 - 归并排序

标签:

原文地址:http://www.cnblogs.com/zhuozhuo/p/5451111.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!