在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ 合并排序
hash表
單詞統(tǒng)計(jì)
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結(jié)構(gòu)的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹(shù)的保存和加載
圖添加和刪除
排序二叉樹(shù)線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉(zhuǎn)
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹(shù)深度遍歷
線性隊(duì)列
循環(huán)和遞歸
快速排序
尋找丟失的數(shù)
A*算法
克魯斯卡爾算法 下
排序二叉樹(shù)
大數(shù)計(jì)算
二叉樹(shù)廣度遍歷
prim算法 下
洗牌算法
圖結(jié)構(gòu)
最大公約數(shù)、最小公倍數(shù)
圖創(chuàng)建
雙向鏈表
字符串查找 上篇
尋路
通用算法的編寫(xiě)
哈夫曼樹(shù) 下
線性堆棧
八皇后
排序二叉樹(shù)刪除-1
挑選最大的n個(gè)數(shù)
字符串查找 中篇
哈夫曼樹(shù) 上
合并排序
回?cái)?shù)
選擇排序
哈希二叉樹(shù)
通用數(shù)據(jù)結(jié)構(gòu)
“數(shù)星星”
單向鏈表
排序二叉樹(shù)插入
圖的保存
排序二叉樹(shù)刪除-2
排序二叉樹(shù)刪除-3
n!中末尾零的個(gè)數(shù)統(tǒng)計(jì)

合并排序

前面一篇博客提到的快速排序是排序算法中的一種經(jīng)典算法。和快速排序一樣,合并排序是另外一種經(jīng)常使用的排序算法。那么合并排序算法有什么不同呢?關(guān)鍵之處就體現(xiàn)在這個(gè)合并上面。

合并算法的基本步驟如下所示:

1)把0~length-1的數(shù)組分成左數(shù)組和右數(shù)組

2)對(duì)左數(shù)組和右數(shù)組進(jìn)行迭代排序

3)將左數(shù)組和右數(shù)組進(jìn)行合并,那么生成的整個(gè)數(shù)組就是有序的數(shù)據(jù)數(shù)組

下面就開(kāi)始實(shí)踐操作:

a)創(chuàng)建函數(shù),判斷參數(shù)的合法性

void merge_sort(int array[], int length)  
{  
    if(NULL == array || 0 == length)  
        return ;  
    _merge_sort(array, 0, length-1);  
}  

b)進(jìn)行merge函數(shù)迭代操作

void _merge_sort(int array[], int start, int end)  
{  
    if(start >= end)  
        return;  

    int middle = start + ((end - start) >> 1);  
    _merge_sort(array, start, middle);  
    _merge_sort(array, middle + 1, end);  
    _merge_data_in_array(array, start, middle, end);  
}  

c)對(duì)合并后的隊(duì)列進(jìn)行合并操作

void _merge_data_in_array(int array[], int start, int middle, int end)  
{  
    int length = end - start + 1;  
    int* pData = NULL;  
    int left = start;  
    int right = middle + 1;  
    int all = 0;  

    /* allocate new memory to the space */  
    pData = (int*) malloc(sizeof(int) * length);  
    assert(NULL != pData);  
    memset(pData, 0, length);  

    /* begin to move data */  
    while(right <= end){  
        while(array[left] <= array[right] && left <= middle){  
            pData[all] = array[left]; left ++; all ++;  
        }  

        if(left > middle)  {  
            break;  
        }  

        while(array[left] > array[right] && right <= end){  
            pData[all] = array[right]; right ++; all ++;  
        }  
    }  

    /* move the left data */  
    if(left <= middle)  
        memmove(&pData[all], &array[left], sizeof(int) * (middle -left +1));  

    if(right <= end)  
        memmove(&pData[all], &array[right], sizeof(int) * (end - right + 1));  

    memmove(&array[start], pData, sizeof(int) * length);  
    free(pData);  
}  

注: 文中使用的pData動(dòng)態(tài)內(nèi)存不是一種最優(yōu)的處理辦法,實(shí)際開(kāi)發(fā)中可以由其他形式的數(shù)據(jù)類(lèi)型代替。

d)編寫(xiě)測(cè)試用例

static void test1()  
{  
    int array[] = {1};  
    merge_sort(array, sizeof(array)/sizeof(int));  
}  

static void test2()  
{  
    int array[] = {2, 1};  
    merge_sort(array, sizeof(array)/sizeof(int));  
    assert(1 == array[0]);  
    assert(2 == array[1]);  
}  

static void test3()  
{  
    int array[] = {3, 2, 1};  
    merge_sort(array, sizeof(array)/sizeof(int));  
    assert(1 == array[0]);  
    assert(2 == array[1]);  
    assert(3 == array[2]);  
}  

static void test4()  
{  
    int array[] = {4, 3, 5, 1};  
    merge_sort(array, sizeof(array)/sizeof(int));  
    assert(1 == array[0]);  
    assert(3 == array[1]);  
    assert(4 == array[2]);  
    assert(5 == array[3]);  
}  

分析快速排序和合并排序的相同點(diǎn)和不同點(diǎn):

  • 相同點(diǎn): 都是迭代操作
  • 不同點(diǎn): 快速排序,先分類(lèi)再迭代;合并排序,先迭代再合并
上一篇:圖創(chuàng)建下一篇:圖的保存