zoukankan      html  css  js  c++  java
  • 归并排序C程序详解

    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    
    using namespace std;
    //归并算法
    void merge(int *a,int begin1, int end1, int begin2, int end2, int *tmp)
    {
    	//进行划分为[begin1,end1],[begin2,end2]的双区间,一个tmp表示为,只要传进一个tmp就可以不用每次开辟新的tmp数组了
    	int index=begin1;
    	int i=begin1,j=begin2;
    	while (i<=end1&&j<=end2){//小的进行归并
    		if (a[i]<=a[j]) tmp[index++]=a[i++];
    		else tmp[index++]=a[j++];
    	}
    	while (i<=end1) tmp[index++]=a[i++];//1数组未结束,归并1数组
    	while (j<=end2) tmp[index++]=a[j++];//2数组未结束,归并2数组
    	memcpy(a+begin1,tmp+begin1,sizeof(int)*(end2 - begin1 + 1));//开呗至原数组
    }
    //归并排序
    void MergeSort(int *a, int left, int right, int *tmp)
    {
    	if(left>=right) return;//左大于右,返回
    	int mid=left+((right-left)>>1);//取mid值
    	MergeSort(a,left,mid,tmp);//进行left到mid进行递归
    	MergeSort(a,mid+1,right,tmp);//进行right到mid进行递归
    	merge(a,left,mid,mid+1,right,tmp);//归并
    }
    
    int main(){
        int a[]={3,7,0,40,25,10,2,1};
    	int *tmp=(int*)malloc(sizeof(int)*(sizeof(a)/sizeof(int)));
    	memset(tmp,-1,sizeof(a)/sizeof(int));
    	MergeSort(a,0,sizeof(a)/sizeof(int)-1, tmp);
    	for(int i=0;i<sizeof(a)/sizeof(int);i++) cout<<a[i]<<" ";
        system("pause");
        return 0;
    }
    
  • 相关阅读:
    Java 线程池学习
    Java线程:新特征-线程池
    创建Java线程池
    JAVA-线程安全性
    java线程安全总结
    栈和队列
    历年题目
    蓝桥杯算法训练
    hdu2083 暴力水
    poj 2299
  • 原文地址:https://www.cnblogs.com/littlepage/p/11648293.html
Copyright © 2011-2022 走看看