我试图实施合并排序,但不知何故已经停留了一天。
[很抱歉粘贴了大量代码,但没有它可以做到这一点]
实施
合并排序 - 功能
int mergeSort(int arr[], int low, int high)
{
int half = (low + high) / 2 ; /* FInd the middle element */
if (low < high)
{
if (high - low == 1) /* If only one element, return */
return;
mergeSort(arr,low,half); /* Sort First Half */
mergeSort(arr,half, high); /* Sort Second Half */
merge(arr,low,half,high); /* Merge */
}
return SUCCESS;
}
合并步骤 - 合并功能
int merge(int arr[], int low, int half, int high)
{
int i = 0, j =0, k = 0, l = 0, temp; /* Initialize indices */
for(i = low, j = half;i < half && j < high; i++,j++) /* Swap in the array itself if the elements are out of order */
{
if (arr[i] > arr[j])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
i = 0,j = low; /* Compare and copy the elements in a global arrray C */
for(k = 0; k < SIZE && i < low && j < high; k++)
{
if (arr[i] < arr[j])
{
c[k] = arr[i];
i++;
}
else
{
c[k] = arr[j];
j++;
}
}
if (i < j) /* Copy remaining elements to the end of the array C */
{
for (l = i; l < low; l++)
{
c[k++] = arr[l];
}
}
else
{
for (l = j; l < high; l++)
{
c[k++] = arr[l];
}
}
输出
8 --> 9 -->
4 --> 5 --> 8 --> 9 -->
4 --> 5 --> 8 --> 9 -->
1 --> 2 --> 4 --> 5 --> 8 --> 9 --> /* Sorting when left is sorted but right is in the process ? */
4 --> 5 --> 6 --> 7 --> 8 --> 9 --> 1 --> 2 -->
1 --> 2 --> 4 --> 5 --> 6 --> 7 --> 8 --> 9 -->
1 --> 2 --> 6 --> 7 --> 4 --> 5 --> 8 --> 9 -->
问题说明
我没有使用任何本地数组来存储数组的元素。相反,如果元素乱序,则交换它们,然后通过比较将其复制到全局数组中 示例:如果我有数组
{ 9, 8, 4, 5, 2, 1, 7, 6}
然后,首先对{8,9}
进行排序,然后对{4,5}
进行排序,然后在复制过程时,即{8,4}
进行比较,依此类推。
发生以下递归调用
mergeSort(0,8) -> mergeSort(0,4) , mergeSort(4,8), merge(0,4,8)
mergeSort(0,4) -> mergeSort(0,2) , mergeSort(2,4), merge(0,2,4)
mergeSort(0,2) -> 1 element calls
and so on.
当{4,5,8,9}
排序时调用合并,右边调用merge(4,5,6)
时,我有以下数组
{4,5,8,9,1,2,7,6}
因此,当{4,5,8,9}
不是此子问题的一部分时,算法会尝试对{1,2}
和{1,2}
进行排序,即我希望{1,2}
和'{6,7}
成为{1,2,6,7}
然后将这两者结合起来。
我如何克服这个问题?我被困了好几个小时。
非常感谢