zoukankan      html  css  js  c++  java
  • 归并排序

    /*
     * 归并排序是稳定的 最好 最坏 平均情况时间复杂度都为O(log n) 空间复杂度为O(n) 在外排序中有着很好的应用。
     * 下面这个是递归的版本
    */
    #include "iostream"
    using namespace std;
    void merge(int a[],int temp[],int left,int right,int rightEnd) { /* 合并2个有序的子序列 */
        int l = left;
        int leftEnd = right - 1;
        int len = rightEnd - left + 1;
        while (left <= leftEnd && right <= rightEnd) {
            if (a[left] <= a[right]) {
                temp[l] = a[left];
                left++;
            }
            else {
                temp[l] = a[right];
                right++;
            }
            l++;
        }
        while (left <= leftEnd)
            temp[l++] = a[left++];
        while (right <= rightEnd)
            temp[l++] = a[right++];
        /* 将temp中的元素复制回a数组 */
        for (int i = rightEnd; len>0; i--,len--) {
            a[i] = temp[i];
        }
    }
    void MSort(int a[],int temp[],int left,int right) {
        if (left < right) {
            int mid = (left + right) / 2;
            MSort(a, temp, left, mid);
            MSort(a, temp, mid + 1, right);
            merge(a, temp, left, mid + 1, right);
        }
    }
    void merge_sort(int a[],int n) {
        int* temp =  (int*)malloc(n*sizeof(int));
        if (temp != NULL) {
            MSort(a, temp, 0, n - 1);
            free(temp);
        }
        else {
            cout << "内存不足" << endl;
        }
    }
    void print(int  a[]) {
        for (int i = 0; i < 10; i++)
            cout << a[i] << " ";
        cout << endl;
    }
    int main() {
        int a[10] = { 3,5,7,4,2,1,0,8,9,6 };
        merge_sort(a, 10);
        print(a);
    }
    /*
     * 归并排序 最好 最坏 平均情况时间复杂度都为O(log n) 空间复杂度为O(n) 在外排序中有着很好的应用。
     * 下面这个是非递归的版本
    */
    #include "iostream"
    using namespace std;
    void merge(int a[],int temp[],int left,int right,int rightEnd) { /* 合并2个有序的子序列 */
    	int l = left;
    	int leftEnd = right - 1;
    	int len = rightEnd - left + 1;
    	while (left <= leftEnd && right <= rightEnd) {
    		if (a[left] <= a[right]) {
    			temp[l] = a[left];
    			left++;
    		}
    		else {
    			temp[l] = a[right];
    			right++;
    		}
    		l++;
    	}
    	while (left <= leftEnd)
    		temp[l++] = a[left++];
    	while (right <= rightEnd)
    		temp[l++] = a[right++];
    }
    /* 一趟2路归并 */
    void MergePass(int a[],int temp[],int n,int length) { /* length:当前有序子列的长度 */
    	int i;
    	for (i = 0; i <= n - 2 * length; i+=2*length) {
    		merge(a,temp,i,i+length,i+2*length-1);
    	}
    	if (i + length < n)
    		merge(a, temp, i, i + length, n - 1);
    	else
    		for (int j = i; j < n; j++)
    			temp[j] = a[j];
    }
    void merge_sort(int a[],int n) {
    	int* temp =  (int*)malloc(n*sizeof(int));
    	int length = 1;
    	if (temp != NULL) {
    		while (length < n){
    			MergePass(a, temp, n, length);
    			length *= 2;
    			MergePass(temp, a, n, length);
    			length *= 2;
    		}
    		free(temp);
    	}
    	else {
    		cout << "内存不足" << endl;
    	}
    }
    void print(int  a[]) {
    	for (int i = 0; i < 10; i++)
    		cout << a[i] << " ";
    	cout << endl;
    }
    int main() {
    	int a[10] = { 3,5,7,4,2,1,0,8,9,6 };
    	merge_sort(a, 10);
    	print(a);
    }
    

      

  • 相关阅读:
    【DL-2-2】卷积神经网络(CNN)--AlexNet、ZFNet、VGGNet、GoogleNet、ResNet
    Python3 错误和异常-(try/except/else/finally/raise/assert)
    生成器 Generators
    Map,Filter 和 Reduce
    装饰器
    目标检测:介绍及传统方法
    【ML-17-2】MCMC--马尔可夫蒙特卡罗方法(MH和Gibbs)
    如何在JDK1.8中愉快地处理日期和时间
    luogu1447 能量采集
    luogu1775 古代人的难题 打表找规律
  • 原文地址:https://www.cnblogs.com/minesweeper/p/6134989.html
Copyright © 2011-2022 走看看