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

    #include <iostream>
    #include <vector>
    #include <string>
    #include <ctime>
    using namespace std;
    void AdjustDown(int A[],int k,int n){
    	A[0]=A[k];
    	for(int i=2*k;i<=n;i*=2){
    		if(i<n&&A[i]<A[i+1])
    			i++;//此时i表示k的子树,此处比较出左右子树中较大的那个进行交换 
    		if(A[0]>=A[i]) break;//如果父节点大于子节点不进行交换 
    		else{
    			A[k]=A[i];
    			k=i;//进行交换 
    		}
    	}
    	A[k]=A[0];
    }
    /*
    根据完全二叉树的性质,最后一个元素(i)的父节点应该是i/2向下取整。
    我们只比较第1到i/2个元素及其子节点关键字的大小就能比较所有的数
    在函数执行一遍之后只找到一个最大的值,并不能保证完全二叉树按后序遍历一样严格排列 
    */
    void BuildMaxHeap(int A[],int n){
    	for(int i=n/2;i>0;i--) //从i/2到1比较 
    	AdjustDown(A,i,n);
    } 
    void HeapSort(int A[],int n){
    	BuildMaxHeap(A,n);
    	for(int i=n;i>1;i--){
    		int temp=A[1];
    		A[1]=A[i];
    		A[i]=temp;
    		cout<<temp<<" ";//执行至此一个最大只已经找到进行输出 
    		AdjustDown(A,1,i-1);//如果不进行输出而是在函数执行结束之后输出的话将是递增数组
    							//因为在此处输出之后将会用最大值和最小值进行交换 
    	}	
    }
    int main(){
    	int A[]={0,53,17,78,54,77,33,55,6,9,45,65,87,32}; //A[0]为辅助空间 
    	HeapSort(A,14);
        return 0;
    }
    

      

    #include<iostream>
    using namespace std;
    const int maxn=100;
    void merge1(int A[],int L1,int R1,int L2,int R2){
    	int i=L1,j=L2;
    	int temp[maxn],index=0;
    	while(i<=R1&&j<=R2){
    		if(A[i]<=A[j]) temp[index++]=A[i++];
    		else temp[index++]=A[j++];
    	}
    	while(i<=R1) temp[index++]=A[i++];
    	while(j<=R2) temp[index++]=A[j++];
    	for(int i=0;i<index;i++)
    		A[L1+i]=temp[i];
    }
    void mergeSort1(int A[],int left,int right){
    	if(left<right){
    		int mid=(left+right)/2;
    		mergeSort1(A,left,mid);
    		mergeSort1(A,mid+1,right);
    		merge1(A,left,mid,mid+1,right);
    	}
    }
    //0	8
    //0	4		5	8
    //0	2		3	5		6	8
    //0	1		1	2		3	4		5	6		7	8
    
    
    
    
    
    
    void merge2(int A[],int L1,int R1,int L2,int R2){
    	int i=L1,j=L2;
    	int temp[maxn],index=0;
    	while(i<=R1&&j<=R2){
    		if(A[i]<=A[j]) temp[index++]=A[i++];
    		else temp[index++]=A[j++];
    	}
    	while(i<=R1) temp[index++]=A[i++];
    	while(j<=R2) temp[index++]=A[j++];
    	for(int i=0;i<index;i++)
    		A[L1+i]=temp[i];
    }
    void mergeSort2(int A[],int n){
    	for(int step=2;step/2<=n;step*=2){
    		for(int i=0;i<=n;i+=step){
    			int mid=i+step/2-1;
    			if(mid+1<=n) 
    				merge2(A,i,mid,mid+1,min(i+step-1,n));
    		}
    	}
    }
    
    int main(){
    	int A[9]={31,87,4,65,1,5,65,513,351};
    	mergeSort1(A,0,8);
    	mergeSort2(A,9);
    	for(int i=0;i<10;i++)
    		cout<<A[i]<<" ";
    }
    

      

  • 相关阅读:
    IDEA安装步骤
    记录常用网站
    IDEA解决中文乱码问题
    使用IDEA 中 实现springboot 热部署 (spring boot devtools版)
    Springboot学习
    写文档步骤
    some untracked working tree files问题解决
    利用mybatis-generator自动生成代码
    Java实现打印功能
    sql语句大全
  • 原文地址:https://www.cnblogs.com/tao7/p/11201621.html
Copyright © 2011-2022 走看看