您的位置:首页 > 其它

归并排序

2015-09-06 02:23 288 查看
采用的 [ 闭合区间 ],

折半,无外呼,总元素是

====
奇数最后分成

========
单1元素, 跟2元素;

====
偶数最后分成

========
单1元素.

于是乎,如果,闭合 [ L < R ]

====
则有俩元素(循环)以上则继续折半;

于是乎,

归并函数

void Merge(int A[], int TemArray[], int Lpos, int Rpos, int Rend)
{/*----------(原数组,临时副本,左开头Lpos,右开头Rpos,右结束Rend)---------*/
int Lend = Rpos - 1,
Tempos = Lpos,
ArrayNums = Rend - Lpos + 1;

while (Lpos <= Lend&&Rpos <= Rend)
if (A[Lpos] <= A[Rpos])
TemArray[Tempos++] = A[Lpos++];
else
TemArray[Tempos++] = A[Rpos++];

while (Lpos <= Lend)
TemArray[Tempos++] = A[Lpos++];
while (Rpos <= Rend)
TemArray[Tempos++] = A[Rpos++];

for (int i = 0; i < ArrayNums; i++, Rend--)
A[Rend] = TemArray[Rend];
}


折半函数

<pre name="code" class="cpp">void getMSort(int A[], int TemArray[], int L, int R){
int Center;

if (L < R){
Center = (L + R) >> 1;
getMSort(A, TemArray, L, Center);
getMSort(A, TemArray, Center + 1, R);
Merge(A, TemArray, L, Center + 1, R);
}
}



复制副本函数

void MergeSort(int A[], int N){
int *TemArray = new int
;

if (TemArray){
getMSort(A, TemArray, 0, N - 1);
delete[]TemArray;
}
else{
cout << "new TemArray Error!";
exit(1);
}
}


主main

#define ARRAYSIZE sizeof(iarray)/sizeof(iarray[0])
int main()
{
int iarray[] = {
432, 373, -312, 906, 949, -220, 379, 723, 91, 394,
-568, -776, -639, 462, 382, -385, 124, 338, 578, -580,
-496, 629, -531, 985, -798, -372, -462, 423, 403, -565,
-227, 758, -665, 723, 734, 458, -495, -445, 696, -334,
-894, -158, -699, 55, -422, 342, -921, 77, 831, -927,
-549, 589, 512, 17, 600, 634, 164, 479, 158, -775,
496, 321, -847, 575, 487, -704, 175, 293, 510, 516,
-749, -484, -855, 881, -424, 121, 50, -613, 701, 988,
727, 388, 466, 626, 910, -229, 727, -454, 912, -26,
695, -667, 971, 451, -188, -251, -809, 508, 432, -148
};

MergeSort(iarray, ARRAYSIZE);
for (int i = 0; i != ARRAYSIZE; i++){
if (i % 10 == 0)cout << "\n";
cout << iarray[i] << ",";
}
return getchar();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: