MERGESORT0228

#MERGE-SORT

* 输入:未排序数组A[p,r]

* 输出:排序数组A[p,r]

#MERGE分析:

* 输入:数组A[p,q,r],A[p,q]和A[q+1,r] 中的元素都按照从小到大的排列好

* 输出:将两个已经排序的部分合并为一个单一的排序数组A[p,r]

1. A[p,q]和A[q,r]分别复制到临时数组left[左侧元素个数 + 1],right[右侧元素个数 + 1]之中,

额外添加MAX作为哨兵元素,

2. 比较两个数组的最小值,并把更小的元素放入A中

3. 如果其中一侧显示为MAX,则不可能为最小,此时另一侧元素放入输出堆,

重复步骤2直到两侧都显示为MAX,一旦发生这种情况,表明左右两侧元素除了MAX都被放入到了输出堆,

所以,步骤2重复次数除MAX外的元素总数,即r-p+1

重复r-q+1次

##pseudocode:

```

MERGE(A[p,q,r])

n1 = p-q+1

n2 = r-q

new arrays left[0..n1] and right[0..n2]

left[n1] = right[n2] = MAX

for i = 0 to (n1 - 1)

left[i] = A[p + i]

for j = 0 to (n2 -1)

right[i] = A[q + 1 + j]

i = j = 0

for key = p to r

if left[i] <= right[j]

A[key] = left[i]

i = i + 1

else A[key] = right[j]

j = j + 1

```

#C语言实现

```

void MERGESORT(int a[], int low, int high)

{

if (low < high) {

int middle = (low + high) / 2;

MERGESORT(a, low, middle);

MERGESORT(a, middle + 1, high);

merge(a, low, middle, high);

}

}

void merge(int a[], int low, int middle, int high)

{

// 临时数组left,right,最后一个元素为哨兵元素

int n1 = middle - low + 1;

int n2 = high - middle;

int* left = (int*)malloc((n1 + 1) * sizeof(int));

int* right = (int*)malloc((n2 + 1) * sizeof(int));

if (left && right) {

left[n1] = right[n2] = MAX;

// a[low, middle]复制到left[0, n1 - 1]

for (int i = 0; i < n1; i++)

left[i] = a[low + i];

for (int j = 0; j < n2; j++)

right[j] = a[j + middle + 1];

int i = 0, j = 0;

for (int key = low; key <= high; key++) {

if (left[i] <= right[j]) {

a[key] = left[i];

i++;

}

else {

a[key] = right[j];

j++;

}

}

free(left);

free(right);

}

}

```

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 设原始数据规模为n,需要采样的数量为k 先选取数据流中的前k个元素,保存在集合A中; 从第j(k + 1 <= j...
    Impossible安徒生阅读 316评论 0 0
  • 排序一直以来都是让我很头疼的事,以前上《数据结构》打酱油去了,整个学期下来才勉强能写出个冒泡排序。由于下半年要准备...
    架构师Javaspring阅读 158评论 0 0
  • 一趟结束后能够确定一个元素的最终位置的排序方法有: 简单选择排序、快速排序、冒泡排序、堆排序 稳定性定义:排序前后...
    Zak1阅读 314评论 0 0
  • 各种排序算法的分析及java实现 排序一直以来都是让我很头疼的事,以前上《数据结构》打酱油去了,整个学期下来才勉强...
    不砍柴的樵夫阅读 164评论 0 2
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,620评论 0 11