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;
    }
  • 相关阅读:
    JS的编码、解码及C#中对应的解码、编码 itprobie
    word、excel、ppt转换成html itprobie
    js 导出到word,excel itprobie
    word、excel、ppt转换成pdf itprobie
    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
    Copy Table From Another Table
    系统表相关SQL语句
    sp_executesql Demo
    SQLServer2000删除重复数据
    SQL Tran Save Point
  • 原文地址:https://www.cnblogs.com/yangyh/p/2082227.html
Copyright © 2011-2022 走看看