Неправильная передача массива? - PullRequest
0 голосов
/ 18 ноября 2010

Я сделал функцию сортировки слиянием:

void mergeSort(int emotionCount[], int low, int high){
    int i=0,k=0;
    //I did this to see the value inside the array, and I always got a garbage value 
    //when i=0, and the first correct value when i=1. I made a for loop here to 
    //see the values in the array in debugging mode in netbean.
    for (i=0;i<=high;i++){            
    }
    if (low == high){
        emotionCount[low]=emotionCount[low];          
    }else{
        int mid = (low+high)/2;
        mergeSort(emotionCount,low,mid);        
        mergeSort(emotionCount,mid+1,high);
        merge(emotionCount, low,mid, high);        }
}
void merge(int emotionCount[], int low,int mid, int high)
{
    int temp[high-low+1];
    int i=low,k=mid+1, j=high, n=0;
    int comparing=emotionCount[k];
    while (i<=mid || k<=high){
        while (emotionCount[i]<comparing)
        {
            temp[n]=emotionCount[i];
            i++;
            n++;

        }
        comparing=emotionCount[i];
        temp[n]=emotionCount[k];
        k++;
        i++;
        n++;
        while (emotionCount[k]<comparing){
            temp[n]=emotionCount[k];
            k++;
            n++;
        }
        comparing=emotionCount[k];
        temp[n]=emotionCount[i];
        k++;
        i++;
        n++;
   }
    while (i<=mid)
    {
        temp[n]=emotionCount[i];
        i++;
        n++;
    }
    while (k<=high)
    {
        temp[n]=emotionCount[k];
        k++;
        n++;
    }
    while (low<=high)
    {
        emotionCount[low]=temp[i];
        low++;
    }
}

И в основном, я передаю массив:

int array[10] = {0,5,8,2,4,6,8,2,20,25};
//number 9 because the highest position is 9. After this, array[10] is supposed to be sorted.
mergeSort(array ,0, 9);

Ну, метод был довольно длинным, но я хочу реализоватьэто сам.По сути, я передаю массив в функцию mergeSort, и если он не имеет минимального размера (равного 1), он будет продолжать передавать этот массив.Что меня беспокоит, так это то, что когда я передаю ему массив, первое значение всегда является значением мусора (например, значением адреса или чего-то в этом роде).Только после того, как я = 1, он даст первое значение массива.Я не понимаюКроме того, каждый раз при выходе из более низкой функции mergeSort для продолжения работы с более высокими значениями все отсортированные значения в массиве становятся равными 0.

Редактирование: переменная k просто используется для хранения значения массива, чтобы увидеть значение массива.когда я в режиме отладки.Я удалил переменную k в функции mergeSort, чтобы устранить путаницу.

Ответы [ 4 ]

1 голос
/ 18 ноября 2010

Еще предстоит прочитать вашу функцию, но на первый взгляд проблема в том, как вы вызываете функцию.

Должно быть:

mergeSort(array, 0, 9); 

Если вы используете array[10], это означает, что вы пытаетесь передать одиннадцатый элемент массива, который, к сожалению, находится за пределами!

0 голосов
/ 18 ноября 2010

Я решил проблему.Исправленный код:

void mergeSort(int emotionCount[], int low, int high){
    int i=0,k=0;

    if (low == high){
        emotionCount[low]=emotionCount[low];
        k=emotionCount[low];
    }else{
        int mid = (low+high)/2;
        mergeSort(emotionCount,low,mid);
        /*
        int i=0;            
        printf("Lower half:");
        for (i=low;i<=mid;i++){
            k=emotionCount[i];            
            printf("%d ",k);            
        }             
        printf("\n");*/

        mergeSort(emotionCount,mid+1,high);

        /*
        printf("Upper half:");
        for (i=mid+1;i<=high;i++){
            k=emotionCount[i];            
            printf("%d ",k);
        }
        printf("\n");*/

        merge(emotionCount, low,mid, high);
        //this is how I view the sorting process, along with other 2 above loops
       /* printf("Merged:");
        for (i=low;i<=high;i++){            
            k=emotionCount[i];
            printf("%d ",k);
        }
        printf("\n\n");*/
    }
}
void merge(int emotionCount[], int low,int mid, int high)
{
    int temp[high-low+1],index;
    for (index=0;index<high-low+1;index++)
    {
        temp[index]=0;
    }
    int i=low,k=mid+1, j=high, n=0;
    int comparing=emotionCount[k],temp1;
    while (i<=mid && k<=high){
        while (emotionCount[i]<comparing && i<=mid)
        {
            temp[n]=emotionCount[i];
            i++;
            n++;
        }
        if (i<=mid){
            comparing=emotionCount[i];
            if (k<=high)
                temp[n]=emotionCount[k];
            else
                temp[n]=comparing;
            k++;
            n++;
        }

        while (emotionCount[k]<comparing && k<=high){
            temp[n]=emotionCount[k];
            k++;
            n++;
        }
        if (k<=high){
            comparing=emotionCount[k];
            if (i<=mid)
                temp[n]=emotionCount[i];
            else
                temp[n]=comparing;
            i++;
            n++;
        }

   }
    while (i<=mid)
    {
        temp[n]=emotionCount[i];        
        i++;
        n++;
    }
    while (k<=high)
    {
        temp[n]=emotionCount[k];        
        k++;
        n++;
    }
    i=0;
    while (low<=high)
    {
        emotionCount[low]=temp[i];
        low++;
        i++;
    }
}

Начальное высокое значение должно быть точно размером массива - 1.

0 голосов
/ 18 ноября 2010
for (i=0;i<=high;i++){
    int k=*(emotionCount+i);
}
if (low == high){
    emotionCount[low]=emotionCount[low];
    int k=emotionCount[low];
}else{
    int mid = (low+high)/2;
    mergeSort(emotionCount,low,mid);
    int i=0;
    for (i=low;i<=mid;i++){
        int k=emotionCount[i];
    }

    mergeSort(emotionCount,mid+1,high);
    for (i=mid+1;i<=high;i++){
        int k=emotionCount[i];
    }
    merge(emotionCount, low,mid, high);
    for (i=low;i<=high;i++){
        int k=emotionCount[i];
    }
}

Вы переопределяете int k во всех этих блоках. Я предполагаю, что вы хотите присвоить значение k вместо этого, так что удалите начальный «int». Как и в Java, с которой вы, как вы утверждаете, знакомы.

Что ты хочешь делать в любом случае? Даже если бы вы использовали ваш глобально объявленный k, присваивать все элементы массива в цикле вообще не имеет смысла. По сути, в конечном итоге k будет равно emotionCount [high].

Знаете ли вы, что вы можете разыменовывать элементы массива, используя синтаксис []?

k = emotionCount[i]

Легче читать.

Вы используете Netbeans, у которого есть хороший интерфейс GDB. Я предлагаю вам установить несколько контрольных точек, пройтись по коду и попытаться понять, что вы там реализовали.

0 голосов
/ 18 ноября 2010

Похоже, что вы передаете значение из массива вместо самого массива: не должен

mergeSort(array[10] ,0, 9);

быть чем-то вроде

mergeSort(array, 0, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...