归并排序

来源:互联网 发布:mjpeg转换为rgb的算法 编辑:程序博客网 时间:2024/06/06 01:20
归并排序,是采用分治法的一个非常典型的应用。
时间复杂度O(nlogn)
空间复杂度O(n)
速度仅次于快速排序,但较稳定。


#include <iostream>using namespace std;/* * array是元素序列,其中从索引first开始到mid位置,按照升序排列, *同时,从(mid+1)到last也已经按照升序排列, *merge()函数将把这两个已经排序好的子序列合并成一个排序序列。 *结果放到array中。  */ void Merge(int *array, int first, int mid, int last){int i,k;int begin1,end1, begin2,end2;int size;int *temp = (int *)malloc((last-first+1)*sizeof(int));begin1 = first;end1 = mid;begin2 = mid+1;end2 = last;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++];size = last-first+1;for (i=0; i<size; i++){array[first+i] = temp[i];}free(temp);}/* 归并排序(递归实现) */void MergeSort(int *array, int first, int last){int mid = 0;if ( first < last ){mid = (first + last) / 2 ;MergeSort(array, first, mid);MergeSort(array, mid+1, last);Merge(array, first, mid, last);}}int main(void){int i;int a[10] = {45,23,41,67,1,4,80,65,9,100};MergeSort(a, 0, 9); for(i=0; i<10; i++) cout<<a[i] <<"\t" ;cout<<endl;return 0;}

原创粉丝点击