[排序]归并排序算法代码

作者
zhonglihao
算法名
归并排序 Merge Sort
分类
排序
复杂度
nlogn型
形式与数据结构
伪代码,需要额外增加一个数组
特性

具体参考出处
《算法导论》
备注


//将有二个有序数列a[first...mid]和a[mid...last]合并。  
void mergearray(int a[], int first, int mid, int last, int temp[])  
{  
    int i = first, j = mid + 1;  
    int m = mid,   n = last;  
    int k = 0;  
      
    while (i <= m && j <= n)  
    {  
        if (a[i] <= a[j])  
            temp[k++] = a[i++];  
        else  
            temp[k++] = a[j++];  
    }  
      
    while (i <= m)  
        temp[k++] = a[i++];  
      
    while (j <= n)  
        temp[k++] = a[j++];  
      
    for (i = 0; i < k; i++)  
        a[first + i] = temp[i];  
}  
void mergesort(int a[], int first, int last, int temp[])  
{  
    if (first < last)  
    {  
        int mid = (first + last) / 2;  
        mergesort(a, first, mid, temp);    //左边有序  
        mergesort(a, mid + 1, last, temp); //右边有序  
        mergearray(a, first, mid, last, temp); //再将二个有序数列合并  
    }  
}  
  
bool MergeSort(int a[], int n)  
{  
    int *p = new int[n];  
    if (p == NULL)  
        return false;  
    mergesort(a, 0, n - 1, p);  
    delete[] p;  
    return true;  
}  

/*
1:1 	512个,	1次
2:2 	256个,	3次
4:4 	128个,	7次
8:8 	64		15
16:16 	32 		31
32:32 	16 		63
64:64	8		127
128:128 4		255
256:256 2		511
512:512 1个,	1023次

time 	= 9217
nlogn 	= 10240
节省10%

每次大概是比较n次(分离之后能够每次都有第一个偷鸡,所以效率比较高)

(n/2)*(2-1)+(n/4)*(4-1)+...(n/n)*(n-1);
*/


你可能感兴趣的:(排序,排序算法概览)