[排序算法] 归并排序

归并排序

【思想】

·简单地将原始序列划分为两个子序列

·分别对每个子序列递归排序

·最后将排好序的子序列合并为一个有序序列,即归并过程

【特点】稳定

 空间代价:O(n)

 时间代价:O(nlogn)

注:

·尽管归并排序最坏比较次数比快速排序少,但它需要更多地元素移动,因此它在实用中不一定比快速排序快

·一般二路归并算法需要另外一个存储空间来存储排好序的数组,空间复杂度为O(n)

二路归并算法(需要另外存储空间)

 1 void Merge(int array[], int left, int middle, int right, int temp[])
 2 {
 3     int i = left,j = middle + 1,k = 0;
 4     while(i <= middle && j <= right)
 5     {
 6         if(array[i] > array[j])
 7         {
 8             temp[k ++] = array[j ++];
 9         }
10         else
11         {
12             temp[k ++] = array[i ++];
13         }
14     }
15     while(i <= middle)
16     {
17         temp[k ++] = array[i ++];
18     }
19     while(j <= right)
20     {
21         temp[k ++] = array[j ++];
22     }
23     for(int p = 0;p < k;p ++)
24     {
25         array[left + p] = temp[p];
26     }
27 }
28 void MergeSort(int array[], int left, int right)
29 {
30     if (left < right)
31     {
32         int *temp = new int[right - left + 1];
33         int middle = (left+right)/2;
34         MergeSort(array, left, middle);
35         MergeSort(array, middle + 1, right);
36         Merge(array, left, middle, right,temp);
37     }
38 }

 

posted @ 2017-03-01 23:35  Strawberry丶  阅读(186)  评论(0编辑  收藏  举报