一直花了几个小时才发现这段代码有什么问题,而我被谷歌搜索过的所有mergesort的算法看起来都差不多,但是这是行不通的;
试图对指针数组进行mergesort:
输出:
2 | 2 | 3 | 3 | 4 | 5 | 4 | 4 | 7 | 7 |
#include <stdlib.h>
#include <stdio.h>
void merge( int ** pointerArray, int pivot,int size){
int leftSize=pivot;
int rightSize=size;
int leftIndex=0, rightIndex=pivot, newIndex=0;
int **tempArray= (int **)malloc(sizeof(int *)*size);
while (leftIndex < leftSize && rightIndex < rightSize) {//merging two sorted array
if ((*pointerArray)[leftIndex]<=(*pointerArray)[rightIndex] )
(tempArray)[newIndex++]=(pointerArray)[leftIndex++];
else
(tempArray)[newIndex++]=(pointerArray)[rightIndex++];
}
while (leftIndex<leftSize )//rest of left array
(tempArray)[newIndex++]=(pointerArray)[leftIndex++];
while (rightIndex<rightSize)//rest of right array
(tempArray)[newIndex++]=(pointerArray)[rightIndex++];
for (int i=0; i<size; i++)//copying the tempArray to the original array
pointerArray[i]=tempArray[i];
free(tempArray);
}
void mergeSort( int ** ptrarray, int size){
if (size==1)
return;
int pivot=size/2;
mergeSort(ptrarray, pivot);
mergeSort(ptrarray+pivot, size-pivot);
merge(ptrarray, pivot, size);
}
int** pointerSort(int* arr, unsigned int size,
char ascend_flag)
{
int **pointerArray= (int **)malloc(sizeof(int *)*size);
for (int i=0; i<size; i++)
pointerArray[i]=&arr[i];
mergeSort(pointerArray, size);
return pointerArray;
}
int main()
{
int size=10;
int array[10]={3,2,3,5,4,7,2,7,4,4};
char ascend_flag =1;
int ** pointer= pointerSort(array, size, ascend_flag);
for (int **p=pointer; p-pointer<size; p++)//print sorted array
printf(" %d|", *(*p));
}
最佳答案
尽管不清楚为什么要对指向int的指针进行排序,而不是仅复制int本身,但这肯定会使您误入歧途。当你说:
if ((*pointerArray)[leftIndex] <= (*pointerArray)[rightIndex])
您没有比较您的打算。
*pointerArray
与pointerArray[0]
相同,或者是列表中第一个int *
。当您想要的实际上是pointerArray[0][leftIndex]
和pointerArray[0][rightIndex]
时,您正在将pointerArray[leftIndex][0]
与pointerArray[rightIndex][0]
进行比较,如下所示:if (*(pointerArray[leftIndex]) <= *(pointerArray[rightIndex]))
工作示例:https://ideone.com/Kgl3oO
ps。数组在您的版本中出现了某种排序的事实是件很不幸的事。尝试使用更复杂的初始数组,例如:
int array[10] = {97, 4, 2, 107, 6, 7, 14, 22, 89, 6};
您会看到类似的结果
4| 97| 7| 14| 22| 6| 2| 6| 107| 89|
关于c - 合并排序不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27090304/