zoukankan      html  css  js  c++  java
  • 堆排序之大顶堆

    对于具有n个元素的序列,采用堆积排序方法需要进行n-1趟排序才能达到目的

    #include <stdio.h>
    void ADJUST(int a[],int i,int n){ 
     a[0] = a[i];
    	for (int j = 2*i;j<=n;j*=2) //层层向下遍历,找到比自己大的孩子节点,
    	//替换自己,最后把头结点也就是最大值,放到尾部a[i](数组末尾)
    	{
    		if (j<n && a[j]<a[j+1])
    		{
    			j++;
    		}
    		if (a[0]>a[j])
    		{
    			break;
    		}
    		a[i] = a[j];
    		i = j;
    	}
    	a[i] = a[0];
    }
    void HEAP_SORT(int a[],int n){
    	for (int i=n/2;i>=1;i--) //n/2表示叶子节点的父母节点的坐标,根节点为1
    	{
    		ADJUST(a,i,n);
    	}
    	for (i=1;i<n-1;i++)
    	{
    		printf("%2d ",a[i]);
    	}
    	printf("%2d
    ",a[i]);
    	for (int j=n-1;j>=1;j--)
    	{
    		int temp = a[j+1];
    			a[j+1] = a[1];
    		a[1] = temp;
    		ADJUST(a,1,j); //交换堆积第一个元素与最后的那个元素的位置
    	}
    
    }
    int main(){
    	int a[] = {-1,26,5,77,1,61,11,59,15,48,19};  //a[0]为临时变量
    	int n = sizeof(a)/sizeof(int); //求出数组总长度
    	HEAP_SORT(a,n-1);  
    	printf("最终结果
    ");
    	for (int i=1;i<n-1;i++)
    	{
    		printf("%2d ",a[i]);
    	}
    	printf("%2d
    ",a[i]);
    
    }
    

    运行结果
    在这里插入图片描述

    小堆积代码只需更改
    void ADJUST(int a[],int i,int n){
    a[0] = a[i];
    for (int j = 2i;j<=n;j=2) //层层向下遍历,找到比自己大的孩子节点,替换自己,最后把头结点也就是最大值,放到尾部ai

            if (j<n && a[j]>a[j+1]) //把大于号>改成小于号<
    		{
    			j++;
    		}
    		if (**a[0]<a[j]**)  //把大于号>改成小于号<
    		{
    			break;
    		}
    

    运行效果如图
    在这里插入图片描述

  • 相关阅读:
    (unix domain socket)使用udp发送>=128K的消息会报ENOBUFS的错误
    HTTP KeepAlive模式
    Windows 7 中的 God Mode
    我的开发环境配置经验
    C#格式化数值结果表(格式化字符串)
    我可怜的笔记本电脑
    JetBrains ReSharper 5.x 注册机
    异常处理准则
    调用 Windows 7 中英文混合朗读
    oracle笔记(2010130)
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/11781678.html
Copyright © 2011-2022 走看看