aboutsummaryrefslogtreecommitdiff
path: root/tests/upload/merge_sort_xunhuan.sy
blob: 55529ec834249c2c76324c9bc899859e9be9573a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
int a[1000];

/* L = 左边起始位置, R = 右边起始位置, RightEnd = 右边终点位置*/ 
void Merge(int a[],int tmpA[],int L,int R,int RightEnd)
{
	/* 将有序的A[L]~A[R-1]和A[R]~A[RightEnd]归并成一个有序序列 */
	int LeftEnd;
	int tmp;
	
	LeftEnd=R-1;/* 左边终点位置 */
	tmp=L;/* 有序序列的起始位置 */ 
	
	while(L<=LeftEnd&&R<=RightEnd){
		if(a[L]<a[R]){
			tmpA[tmp]=a[L];/* 将左边元素复制到TmpA */
			tmp = tmp+1;
			L = L+1; 
		}
		else{
			tmpA[tmp]=a[R];/* 将右边元素复制到TmpA */
			tmp = tmp+1;
			R = R+1; 
		}	
	} 
	
	while(L<=LeftEnd){
		tmpA[tmp]=a[L];/* 直接复制左边剩下的 */
		tmp = tmp+1;
		L = L+1; 
	}
	while(R<=RightEnd){
		tmpA[tmp]=a[R];/* 直接复制右边剩下的 */
		tmp = tmp+1;
		R = R+1; 
	}
} 

/* length = 当前有序子列的长度*/
void Mergepass(int a[],int tmpA[],int n,int length) 
{/* 两两归并相邻有序子列 */
	int i;
	int j;
	i=0;
	while(i<=n-2*length){
		Merge(a,tmpA,i,i+length,i+2*length-1);
		i = i + 2*length;
	}
	if(i+length<n){/* 归并最后2个子列----剩余的个数够一个length,不够两个length*/
		Merge(a,tmpA,i,i+length,n-1); 
	}
	else{/* 最后只剩1个子列---剩余的个数不够一个length*/
		j = i;
		while(j<n){
			tmpA[j]=a[j];
			j=j+1;
		}
	}	
} 

void MergeSort(int a[],int n)//稳定 
{
	int length;
	int tmpA[1000];
	
	length=1;/* 初始化子序列长度*/
		while(length<n){
			Mergepass(a,tmpA,n,length);
			length=length*2;
			Mergepass(tmpA,a,n,length);
			length=length*2;
		} 
}

int main()
{
	int size;
	int i;
	size = getint();
	i = 0;
	while(i<size){
		a[i] = getint();
		i=i+1;
	} 
	MergeSort(a,size);
	putarray(size,a); 
	putch(10);
	return 0;
}