读书人

二路归并排序 哪位高手能告诉小弟我错

发布时间: 2012-03-14 12:01:12 作者: rapoo

二路归并排序 谁能告诉我错哪里了吗?
#include "stdafx.h"
#include "iostream"
#define NUM 8
using namespace std;
void merge(int *a,int head,int tail)
{
int b[20];
int i = head;
int t = tail;
int mid = tail/2;
int j = tail/2+1;
int k = 0;
while(i<=mid && j<=t)
{
if(a[i]<=a[j])
{
b[k]=a[i];
i++;
}
else{
b[k] = a[j];
j++;
}
k++;
}
while(i<=mid){
b[k] = a[i];
i++;
k++;
}
while(j<=t){
b[k]=a[j];
k++;
j++;
}
for(i = head,k = 0;i<=tail;i++,k++)
a[i] = b[k];
//return b;
}
void merge_sort(int *a,int head,int tail)
{
int mid;
if(head<tail){
mid = (head+tail)/2;
merge_sort(a,head,mid);
merge_sort(a,mid+1,tail);
merge(a,head,tail);
}
}
int _tmain(int argc, _TCHAR *argv[])
{
int a[]={4,5,7,1,2,3,6,7,8,9,10,45,2};
//quick_sort(a,0,8);
//bubble_sort(a,0,5);
merge_sort(a,0,12);

for(int i =0 ;i<=12;i++)
cout<<a[i]<<" ";
return 0;
}


[解决办法]
http://topic.csdn.net/u/20090705/23/84cc02da-676d-44aa-a619-7936f30ab2e6.html

以前写的,参考:

C/C++ code
#pragma warning(disable:4786)#include <iostream> #include <stdio.h>#include <stdlib.h>#include <malloc.h>#include <string.h>#include <math.h>using namespace std;const int NUM=20;int arr[] = {1,10,11,5,6,15,0,15,16,14,0,8,17,15,7,19,17,1,18,7};void merge(int v[],int left,int mid,int right)       //合并[left,mid]和[mid+1,right]{    int i,j,k=0;    i=left;                        //i为第一路的下标    j=mid+1;                       //j为第二路的下标    int *temp=new int[right-left+1];    while(i<=mid&&j<=right)        temp[k++]=(v[i]<=v[j])?v[i++]:v[j++];        //依次合并2路到temp数组    while(i<=mid)        temp[k++]=v[i++];    while(j<=right)        temp[k++]=v[j++];    for(i=left,j=0;i<=right;++i,++j)                  //合并完数据写回v数组        v[i]=temp[j];    delete []temp;}void merge_sort(int v[],int num){    int i,size,j,mid,right;    for(i=1;i<num;i*=2)          //log(n)趟归并    {        size=i-1;        j=0;        while(j<num)        {            mid=j+size;            right=j+2*size+1;            if(mid>=num)                       //下标不能溢出                mid=num-1;            if(right>=num)                right=num-1;            merge(v,j,mid,right);            j=right+1;        }    }}void main(){    int j;    merge_sort(arr, NUM);    for(j=0; j<NUM; j++)        printf("%d ", arr[j]);    printf("\n");}
[解决办法]
探讨
算法原理明白啊,但就是不知道代码错哪里了。。。。
谁能帮忙指出吗??

引用:
二路排序非原地排序
需要开辟数组空间

读书人网 >C++

热点推荐