I got this as homework. using merge-sort, I'm trying to sort an array of integers that a new array of pointers will hold the pointers to each integer in the right order so if arr = {7,2,5,9,4} than the pointers array will be {ptr to 2, ptr to 4, ptr to 5, ptr to 7, ptr to 9}
so, at first I was required to write the function as following:
int** pointerSort(int* arr, int size);
and I did that:
int** pointerSort(int* arr, int size) {
int **res1, **res2, **res;
if (size <= 1) {
if (size == 0)
return NULL;
res = (int **)malloc(sizeof(int) * size);
*res = arr;
return res;
}
res1 = pointerSort(arr, size/2);
res2 = pointerSort(arr + size/2, size - size/2);
res = (int **)malloc(sizeof(int **) * size);
merge(res1,size/2,res2, size - size/2,res);
return res;
}
void merge (int **arr1, int size1, int **arr2, int size2, int **res) {
int i1,i2, resI;
i1 = i2 = resI = 0;
while (i1 < size1 && i2 < size2) {
if (**(arr1 + i1) <= **(arr2 + i2)){
*(res + resI++) = *(arr1 + i1++);
}
else {
*(res + resI++) = *(arr2 + i2++);
}
}
while (i1 < size1) {
*(res + resI++) = *(arr1 + i1++);
}
while (i2 < size2) {
*(res + resI++) = *(arr2 + i2++);
}
}
but after that I needed to change it to
void pointerSort2(int* arr, int size, int*** pointers);
and that's where I'm stuck. This is what I've got so far and it doesn't seem to work
void pointerSort2(int* arr, int size, int*** pointers) {
if (size <= 1) {
if (size == 0)
return;
pointers = (int ***)malloc(size * sizeof(int ***));
*pointers = &arr;
return;
}
pointerSort2(arr, size/2,pointers);
pointerSort2(arr + size/2, size - size/2,pointers);
int ***res = (int ***)malloc(sizeof(int ***) * size);
merge2(pointers,size/2,pointers, size - size/2,res);
pointers = res;
}
void merge2 (int ***arr1, int size1, int ***arr2, int size2, int ***res) {
int i1,i2, resI;
i1 = i2 = resI = 0;
int val;
int val2;
int b;
while (i1 < size1 && i2 < size2) {
int val = ***(arr1 + i1);
int val2 = ***(arr2 + i2);
int b = ***(arr1 + i1) <= ***(arr2 + i2);
if (b) {
*(res + resI++) = *(arr1 + i1++);
}
else {
*(res + resI++) = *(arr2 + i2++);
}
}
while (i1 < size1) {
*(res + resI++) = *(arr1 + i1++);
}
while (i2 < size2) {
*(res + resI++) = *(arr2 + i2++);
}
}
Thanks a lot
mallocworks this way:Type* res = malloc(sizeof(Type) * size);- mind the correctness of dereferences.