合并排序 MergeSort, 终于自己做出来了

    合并排序算法, 递归实现.。将一个待排序数组分成两个更小的数组, 排序后再合并。

    总结一下思想,就是"大事化小, 小事化无",大问题化成小的同类型的子问题。

 

(Vim + GCC,   Win 7)

 

#include <stdio.h>

/* * * * * * * * * * * * * * *
 * 合并排序中合并两个已序数组的函数.
 * 这里就是合并leftHalf和rightHalf.
 * 参数:
 *      leftHalt:大数组的左半部分.
 *      rightHalf:大数组的右半部分.
 *      length:注意, 这个长度是两个数组的总长度(大数组的长度).
 *      mid:大数组的中间位置的索引. (也即左数组leftHalf的右边界)
 * * * * * * * * * * * * * */
void Merge(int* const leftHalf, int* const rightHalf, int length, int mid)
{
    int i = 0,//表示数组leftHalf当前的索引值
        j = 0,//表示数组rightHalf当前的索引值
        k = 0;//表示 临时数组temp[] 当前的索引值
    int temp[length];//存放合并结果的临时数组. 记得最后要放回原数组!(leftHalf[length])


    while (i < mid && j < length - mid)
    {
        if (leftHalf[i] < rightHalf[j])
        {
            temp[k++] = leftHalf[i++];
        }
        else
        {
            temp[k++] = rightHalf[j++];
        }
    }

    /* * * * * * * * * * * * * * * * * * * *
     * 此 if-else 将剩余的元素加到temp的末尾
     *      i == mid: 说明数组rightHalf元素
     *                有剩余.
     *      else: 说明数组leftHalf元素有剩余.
     * * * * * * * * * * * * * * * * * * * */
    if (i == mid)
    {
        for ( ; j < length - mid; ++j)
        {
            temp[k++] = rightHalf[j];
        }
    }
    else
    {
        for ( ; i < mid; ++i)
        {
            temp[k++] = leftHalf[i];
        }
    }

    //结果放回原数组
    for (i = 0; i < length; ++i)
    {
        leftHalf[i] = temp[i];
    }
}


/* * * * * * * * * * * * * * *
 * 合并排序算法, 递归实现.
 * 将一个待排序数组分成两个更小的数组, 排序后再合并
 * 参数:
 *      array:待排序数组的首地址.
 *      length:数组的长度.
 * * * * * * * * * * * * * * */
void MergeSort(int* const array, int length)
{
    int mid;
    if (length > 1)
    {
        mid = length >> 1;
        int* leftHalf = array;
        int* rightHalf = (array + mid);

        MergeSort(leftHalf, mid);//排序左半部分
        MergeSort(rightHalf, length - mid);//排序右半部分

        Merge(leftHalf, rightHalf, length, mid);//左右两部分合并
    }
}

//Aplication start
int main(void)
{
    int length = 0;
    puts("    My Merge Sort");

    printf("Input the amount of numbers:");
    do
    {
        scanf("%d", &length);
    } while(length < 1);

    int num_array[length];
    int i;

    printf("Input numbers for sorting:");
    for (i = 0; i < length; ++i)
    {
        scanf("%d,", num_array + i);
    }

    printf("Before sorting:");
    for (i = 0; i < length; ++i)
    {
        printf("%d  ", num_array[i]);
    }
    puts("");

    MergeSort(num_array, length);//这里调用 合并排序

    printf("After sorting:");
    for (i = 0; i < length; ++i)
    {
        printf("%d  ", num_array[i]);
    }
    puts("");

    getch();
    return 0;
}

合并排序 MergeSort, 终于自己做出来了_第1张图片

 


测 试 结 果

 

你可能感兴趣的:(合并排序 MergeSort, 终于自己做出来了)