合并排序合并而不使用临时数组

时间:2013-09-03 20:53:11

标签: c sorting merge

我试图实施合并排序,但不知何故已经停留了一天。

[很抱歉粘贴了大量代码,但没有它可以做到这一点]

实施

合并排序 - 功能

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}然后将这两者结合起来。

我如何克服这个问题?我被困了好几个小时。

非常感谢

0 个答案:

没有答案