[排序算法] 归并排序

来源:互联网 发布:手机微信连不上网络 编辑:程序博客网 时间:2024/06/07 22:52
归并排序

【思想】

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

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

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

【特点】稳定

 空间代价: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         else11         {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 }

 

原创粉丝点击