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

    不稳定排序
    比较次数与初始序列有关(基本有序时可以减少堆的调整次数)
    // HeapSort.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    void swap(int *a,int *b);
    void printArr(int arr[],int length){
    	
    	for(int i=1;i<=length;i++)
    		printf("%d ",arr[i]);
    	printf("\n");
    }
    void adjustHeap(int arr[],int size,int i);
    void buildHeap(int arr[],int size){
    //首先要进行建堆,从堆的倒数第二层的最后一个开始,到顶层,对每个节点调整堆
    	for(int i=size/2;i>=1;i--)
    		adjustHeap(arr,size,i);
    }
    
    void adjustHeap(int arr[],int size,int i){
    
    //调整第i个节点,比较左孩子、右孩子、自己,选出大的放到上面,并递归调整交换的节点
    	int left = 2*i;
    	int right = 2*i+1;
    	int larger = i;
    
    	if(left<=size&&arr[left]>arr[larger]){
    		larger = left;
    	}
    	if(right<=size&&arr[right]>arr[larger]){
    		larger = right;
    	}
    	if(i!=larger){
    		
    
    		swap(&arr[i],&arr[larger]);
    		
    		adjustHeap(arr,size,larger);
    	}
    }
    void heapSort(int arr[],int heapSize){
    
    	buildHeap(arr,heapSize);
    //建好堆后,堆顶就是最大值了,现在把堆顶与最后一个元素交换,堆大小减一,再调整堆,每次从堆顶取出最大值与最后一个交换。
    //所以说堆排序不是稳定排序,比如堆顶为10,右下角子树为2,2,2时,会把最后一个2提到堆顶,从而改变了原来三个2的次序
    	for(int i=heapSize;i>1;i--){
    		int tmp = arr[1];
    		arr[1]=arr[i];
    		arr[i]=tmp;
    		heapSize--;
    		adjustHeap(arr,heapSize,1);
    	}
    	
    }
    inline int parent(int i){
    	return i/2;
    }
    void swap(int *a,int *b){
    	int tmp = *a;
    	*a = *b;
    	*b = tmp;
    }
    //void heapIncreaseKey(int arr[],int index,int newVal){
    //	
    //	if(arr[index]>newVal)return;
    //	
    //	arr[index]=newVal;
    //	
    //	while(index>1&&arr[parent(index)]<arr[index]){
    //		
    //		swap(&arr[parent(index)],&arr[index]);
    //		
    //		index = parent(index);
    //		
    //	}
    //}
    int main(int argc, char* argv[])
    {
    	int num[]={0,-3,11,23,45,6,43,65,43,75,65,32,77,32,12
    	};
    	int length = sizeof(num)/sizeof(int) - 1;
    	heapSort(num,length);
            printArr(num,length);
    	return 0;
    }
  • 相关阅读:
    oracle 10g 免安装客户端在windows下配置
    sql2005 sa密码
    使用windows live writer 有感
    windows xp SNMP安装包提取
    汉化groove2007
    迁移SQL server 2005 Reporting Services到SQL server 2008 Reporting Services全程截图操作指南
    foxmail 6在使用中的问题
    AGPM客户端连接不上服务器解决一例
    SpringSource Tool Suite add CloudFoundry service
    Java 之 SWing
  • 原文地址:https://www.cnblogs.com/yangyh/p/2082227.html
Copyright © 2011-2022 走看看