您的位置:首页 > 其它

归并排序

2016-10-25 01:12 155 查看
归并排序,通过一一排序使得两个相邻的数字有序,二二排序使得四个相邻的数字有序,四四排序使得八个相邻的数字有序,通过一定的次数使得整个数组有序。

归并排序是稳定的。归并排序的空间复杂度位O(n),时间复杂度,不管初始数据有序还是乱序,都是要进行向下移动的。

bool mager_once(int *arr, int len, int gap)
{
if (arr==NULL && len<1 && gap<=0)
{
return false;
}
int e1 = 0;
int r1 = e1+gap-1;
int e2 = r1+1;
int r2 = (e2+gap-1)<len ? (e2+gap-1):len-1;

int *p = (int *)malloc(sizeof(int)*len);
assert(p != NULL);
int k = 0;

while (e2 < len)
{
while(e1<=r1 && e2<=r2)    //用此条件会造成在最后一个值的时候,一个数会跳到下一组的比较中
{
if (arr[e1] <= arr[e2])
{
p[k] = arr[e1];
e1++;
k++;
}
if (arr[e1] > arr[e2])
{
p[k] = arr[e2];
e2++;
k++;
}
}

while(e1<=r1)
{
p[k] = arr[e1];
e1++;
k++;
}
while(e2<=r2)
{
p[k] = arr[e2];
e2++;
k++;
}

e1 = r2+1;
r1 = e1+gap-1;
e2 = r1+1;
r2 = (e2+gap-1)<len ? (e2+gap-1):len-1;
}

while (e1<len)//将e1中没有复制过去的数据进行复制
{
p[k] = arr[e1];
k++;
e1++;
}

while (len--)
{
arr[len] = p[len];
}
free(p);
return true;
}

bool mager_sort(int *arr, int len)
{
if(arr == NULL || len<1)
{
return false;
}

for(int i=1; i<len; i=i*2)
{
mager_once(arr, len, i);
}
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  归并排序