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

    堆相关操作

    建堆

    向下堆化

    向上堆化

    删除堆顶(向下堆化)

    添加元素(向上堆化)

    堆排序

    建堆(逆序 向下堆化)

    排序(向下堆化)

    Code

    #include <iostream>
    using namespace std;
    const int maxn=100;
    int arr[maxn]= {5,2,6,7,4,3,0,9,8,1};
    int len =10;
    //向下堆化
    void downAjust(int low,int heigh) {
    	int i=low,j=low*2+1;
    	while(j<=heigh) {
    		if(j+1<=heigh&&arr[j]<arr[j+1])j=j+1; //若右子节点存在,并且大于左子节点
    		if(arr[i]>arr[j])break;
    		else {
    			swap(arr[i],arr[j]);
    			i=j;
    			j=2*i+1;
    		}
    	}
    }
    //向上堆化
    void upAjust(int low,int high) {
    	int i=high,j=(i-1)/2;
    	while(j>=low&&i>0) {
    		if(arr[i]<arr[j])break;//父节点权值大于子节点权值
    		else {
    			swap(arr[i],arr[j]);
    			i=j;
    			j=(i-1)/2;
    		}
    	}
    }
    //建堆
    void heap() {
    	for(int i=(len-1)/2; i>=0; i--)
    		downAjust(i,len-1); //向下调整
    }
    // 堆排序
    void heap_sort() {
    	for(int i=len-1; i>=1; i--) {
    		swap(arr[i],arr[0]); //最后一个节点与堆顶交换
    		downAjust(0,i-1); //堆顶向下堆化
    	}
    }
    // 打印堆
    void print_heap() {
    	for(int i=0; i<len; i++) {
    		printf("%d",arr[i]);
    		printf("%s",i==len-1?"
    ":" ");
    	}
    }
    // 插入元素
    void insert(int v) {
    	arr[len++]=v;
    	upAjust(0,len-1);
    }
    // 删除堆顶
    void delete_top(){
    	swap(arr[0],arr[--len]);
    	downAjust(0,len-1);	 
    } 
    int main(int argc,char *argv[]) {
    	heap();
    	// 堆排序
    //	print_heap();
    //	heap_sort();
    //	print_heap();
    
    
    	// 插入元素
    //	print_heap();
    //	insert(10);
    //	print_heap();
    
    	// 删除元素
    //	print_heap();
    //	delete_top();
    //	print_heap();
    
    	return 0;
    }
    
  • 相关阅读:
    团队冲刺第三天
    NoSQL数据库基础概述
    团队开发冲刺第九天
    团队开发冲刺第八天
    团队开发冲刺第七天
    团队开发冲刺第六天
    团队开发冲刺第五天
    团队开发冲刺第四天
    团队开发冲刺第三天
    第九周总结
  • 原文地址:https://www.cnblogs.com/houzm/p/12345019.html
Copyright © 2011-2022 走看看