歸併排序(代碼)-遞歸方法

merge函數:將數組從left(起始位置)到right(終點位置)的數據,先折半拆分爲兩組。分別從兩組的起始數據開始進行比較,較小的值被保存,然後標誌值增加(指針後移),直到將兩組數據全都遍歷一遍。將保存的數據依次按順序覆蓋寫入數組a,作爲輸出流輸出。

mergesort函數(歸併排序):利用遞歸的方法進行數組的拆分,調用merge函數,實現排序。


/* 將數組折半分組後,再合併排序*/
static void merge(int a[], int left, int right)
{
    int mid = (left + right) / 2;
    int i = left;
    int j = mid + 1;
    int k = 0;

    int *temp = (int *)malloc(sizeof(int) * (right - left + 2));
    assert(temp);

    while(i < mid + 1 || j < right + 1)
    {
        if(i < mid + 1 && j < right + 1)
        {
            if(a[i] < a[j])
            {
                temp[k] = a[i];
                k++;
                i++;
            }
            else
            {
                temp[k] = a[j];
                k++;
                j++;
            }
        }
        else if(i < mid + 1)
        {
            temp[k] = a[i];
            k++;
            i++;
        }
        else
        {
            temp[k] = a[j];
            k++;
            j++;
        }
    }

    i = 0;
    for(j = left; j < right + 1; j++)
    {
        a[j] = temp[i];
        i++;
    }

    free(temp);
}

/*
    *Function   : mergeSort
    *Description: 歸併排序
    *Param in   : a       待排序的數據首地址
                  left    待排序的數據起始位置(最低位爲0right   待排序的數據終點位置
    *Param out  : a       排序後的數據首地址
    *Retrun     : 無
 */
void mergeSort(int a[], int left, int right)
{
    int mid = 0;
    if(left == right)
    {
        return;
    }
    else
    {
        mid = (left + right) / 2;
        mergeSort(a, left, mid);
        mergeSort(a, mid + 1, right);
        merge(a, left, right);
    }
}
發佈了43 篇原創文章 · 獲贊 19 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章