知识库 人物 历史 地理 自然 文化 艺术 社会 科学 技术 教育 生活 体育 企业 银行 组织 官职 外交 联合国 博物馆 基金会 纪念馆 军事组织 组织机构 职能部门 诺贝尔奖 汉族 民俗 风俗 婚俗 姓氏 习俗 百家姓
  归并排序           

归并排序

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

归并操作

归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。

算法描述

归并操作的工作原理如下:

申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

设定两个指针,最初位置为别为两个已经排序序列的起始位置

比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针达到序列尾

将另一序列剩下的所有元素直接复制到合并序列尾

示例代码

以下示例代码实现了归并操作。array[]是元素序列,其中从索引p开始到q位置,按照升序排列,同时,从(q+1)到r也已经按照升序排列,merge()函数将把这两个已经排序好的子序列合并成一个排序序列。结果放到array中。

/**

* 0 <= p <= q < r, subarray array[p..q] and array[q+1..r] are already sorted.

* the merge() function merges the two sub-arrays into one sorted array.

*/

static void merge(int array[], int p, int q, int r)

{

int i,k;

int begin1,end1,begin2,end2;

int* temp = (int*)malloc((r-p)*sizeof(int));

begin1= p;     end1 = q;

begin2 = q+1;  end2 = r;

k = 0;

while((begin1 <= end1)&&( begin2 <= end2))

{

if(array[begin1]<array[begin2])

{

temp[k] = array[begin1];  begin1++;

}

else

{

temp[k] = array[begin2];  begin2++;

}

k++;               

}

while(begin1<end1)

{

temp[k++] = array[begin1++];

}

while(begin2<end2)

{

temp[k++] = array[begin2++];

}

for (i = 0; i < (r - p); i++)

array[p+i] = temp;

free(temp);

}

归并排序

归并排序具体工作原理如下(假设序列共有n个元素):

将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素

将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素

重复步骤2,直到所有元素排序完毕

示例代码

示例代码为C语言,输入参数中,需要排序的数组为array[],起始索引为first,终止索引为last。调用完成后,array[]中从first到last处于升序排列。

void merge_sort(int array[], unsigned int first, unsigned int last)

{

int mid = 0;

if(first<last)

{

mid = (first+last)/2;

merge_sort(array, first, mid);

merge_sort(array, mid+1,last);

merge(array,first,mid,last);

}

}

算法复杂度

比较操作的次数介于(nlogn) / 2和nlogn - n + 1。 赋值操作的次数是(2nlogn)。归并算法的空间复杂度为:Θ (n)

上一篇:知识:埃及吉札金字塔  下一篇:知识:白眉蝮
∷排行知识文章∷ ∷推荐知识文章∷
· 国际货运代理
· 雅尔塔体制
· 夜盲症
· 海林檎
· 特罗保和莱巴赫会议
· 花朝节
· 层岩丛树图轴
· 免费打电话
· 摩德纳
· 蔡昌年
· 波谲云诡
· 盘庚迁殷
· 神仙固本酒
· 特里埃斯蒂纳
· 三宣六慰
· 饣它汤
· 土地征用
· 卢嘉锡
· 秋柳双鸦图
· 香茅鸡翅
· 前苏联7.62毫米IIKMC通用机枪
· 清汤苦瓜
· 右旋糖酐10
· 夫役
Copyright © 2006-2008 版权所有 中华知识库
本站资源均来源于网络,如侵犯了您的版权,请来信告知,我们将立即改正!
信箱: QQ:26655353 粤ICP备05006761号

 股票 贸易 钱币 铸币 税收 营销 证券 流行 另类 涂鸦 饰品 模特 茶道 纹身 手绘 暴走 自拍 品牌