zoukankan      html  css  js  c++  java
  • 堆排序

    问题:对可以分为大顶堆和小顶堆。

    大顶堆满足父节点大于左右孩子节点:父节点i,则i>2*i  ;i>2*i+1;

    小顶堆满足父节点小于左右孩子节点:父节点i,则i<2*i  ;i<2*i+1;

    指针问题,在交换两个变量时,确保交换,要用指针。

    下面代码是小顶堆排序。

    代码:

    #include  <iostream>
    using namespace std;
    
    void buildHeap(int arr[],int length)         //建立堆
    {
    	int i;
    	int *min;
    	int *temp;
    	int t;
    	int f;
    	int k;
    	int flag;
    	int n=length/2;
    	for(i=n;i>0;i--)
    	{
    		f=i;
    	
    		while(2*f<=length)            //循环向下判断
    		{
    			temp=&arr[f-1];
    			min=&arr[2*f-1];
    			flag=2*f;
    			if(2*f+1<=length)
    			{
    				if(arr[2*f]<*min)     //选择孩子节点中较小的节点
    				{
    					min=&arr[2*f];
    					flag=2*f+1;
    				}
    			}
    			if(*min<*temp)            //父节点小于孩子节点,则交换
    			{
    			//	cout<<*temp<<":"<<*min<<"--";
    				t=*temp;
    				*temp=*min;
    				*min=t;
    				f=flag;
    			//	cout<<flag<<"--";
    			}
    			else
    				break;
    		}
    
    	}
    }
    void heapSort(int arr[],int length)          //  堆排序
    {
    	buildHeap(arr,length);
    	cout<<arr[0]<<"  ";
    	arr[0]=arr[length-1];
    }
    int main()
    {
    	int arr[10]={9,3,5,1,2,0,4,8,6,7};
    	int i,j;
    	cout<<"排序前:"<<endl;
    	for(i=0;i<10;i++)
    	{
    		cout<<arr[i]<<"  ";
    	}
    	cout<<endl;
    	cout<<"堆排序后:"<<endl;
    	for(j=10;j>0;j--)
    	{
    		heapSort(arr,j);
    	}
    	cout<<endl;
    	return 0;
    }
    

     运行结果:

  • 相关阅读:
    【Vue】状态管理
    【Vue】路由
    【Vue】组件
    【Vue】基础(数据 & 计算属性 & 方法)
    【Vue】基础(虚拟DOM & 响应式原理)
    【Vue】基础(生命周期 & 常用指令)
    【Vue】搭建开发环境
    【Mongodb】事务
    【Mongodb】视图 && 索引
    【Mongodb】聚合查询 && 固定集合
  • 原文地址:https://www.cnblogs.com/xshang/p/3109160.html
Copyright © 2011-2022 走看看