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;
    }
    

     运行结果:

  • 相关阅读:
    软件层次结构
    PHP 配合Cross-Origin Resource Sharing实现跨域 使用心得
    C语言 标准I/O库函数 fgets 使用心得
    PHP 逗号运算符 的作用
    PHP 函数 array_map 使用心得
    PHP 函数 htmlspecialchars 使用心得
    Go语言特性学习
    curl文件上传类
    php 协程理解
    php 分词扩展 scws
  • 原文地址:https://www.cnblogs.com/xshang/p/3109160.html
Copyright © 2011-2022 走看看