• 堆排序


    堆排序

    利用堆的结构(事实上就是二叉树)进行排序,首先对数据进行调整调整为一个大根堆或者小根堆,其次取出最大或最小的值放入最后一个页节点,继续调整剩余的二叉树形成一个新的堆。递归直到完毕。当中有几个概念须要明确,对于一个有n个节点的全然二叉树第一个非页节点为(n/2-1),其左子树为 当前节点下标(i*2+1)。

    详细实现例如以下

    void stuckSmall(long *str,int start,int end){
            if(end<=0 || start>=end || str == NULL)
                    return;
            int left = 2*start+1;
            int right = left+1;
            int max = start;
            if(start<=end){
                    if(right<=end && str[max]<str[right])
                            max = right;
                    if(left<=end && str[max]<str[left])
                            max = left;
                    if(max != start){
                            swap(&str[start],&str[max]);
                            //对子树进行递归调整
                            stuckSmall(str,max,end);
                    }
            }
    
    
    }
    void stuckSort(long *str,int length){
            if(str == NULL || length<=0)
                    return;
            int i=0;
           //最后一个非叶节点
           int n = length/2-1;
           //将数组调整为堆结构,最后一个非叶节点处開始
            for(n;n>=0;n--){
                    stuckSmall(str,n,length);
            }
            for(i=length-1;i>=0;i--){
                     //将堆中的第一个值放入最后的位置
                    swap(&str[0],&str[i]);
                   //将剩余调整为小根堆
                   stuckSmall(str,0,i-1);
            }
    
    }
    
    
    完整代码

    #include <stdio.h>
    #include <malloc.h>
    void swap(long *A,long *B){
    	long tmp;
    	tmp = *A;
    	*A = *B;
    	*B = tmp;
    }
    int genrand(int num,long * array ){
    	if (num>10000)
    		return 0 ;
    	srand((unsigned int)time(0));
    	int i=0;
    	for(i=0;i<num;i++)
    		array[i] = rand();
    	return 1;
    	
    }
    void stuckSmall(long *str,int start,int end){
    	if(end<=0 || start>=end || str == NULL)
    		return;
    	int left = 2*start+1;
    	int right = left+1;
    	int max = start;
    	if(start<=end){
    		if(right<=end && str[max]<str[right])
    			max = right;
    		if(left<=end && str[max]<str[left])
    			max = left;
    		if(max != start){
    			swap(&str[start],&str[max]);
    			stuckSmall(str,max,end);
    		}
    	}
    	
    	
    }
    void stuckSort(long *str,int length){
    	if(str == NULL || length<=0)
    		return;
    	int i=0;
    	int n = length/2-1;
    	for(n;n>=0;n--){
    		stuckSmall(str,n,length);
    	}
    	for(i=length-1;i>=0;i--){
    		swap(&str[0],&str[i]);
    		stuckSmall(str,0,i-1);
    	}
    	
    }
    void call(){
    	long *array = (long *)malloc(sizeof(long)*10);
    	genrand(10,array);
    	stuckSort(array,10);
    	int i=0;
    	for(i;i<10;i++)
    		printf("%ld
    ",array[i]);
    
    }
    
    void main(int argc,char **argv){
    	call();
    	
    }
    

    执行环境:ubuntu14.04、gcc

  • 相关阅读:
    *VC编程规范
    C++的va_start() va_end()函数应用(转)
    * C++类的分解,抽象类与纯虚函数的需要性
    *C++中的回调
    *C++中使用接口
    C++模版使用
    *获取mac地址的方法
    *数字——字符之间的转换(转)
    eclipse雕虫小技一:eclipse打开文件目录
    Hibernate升级后注解方式的对象关系映射
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7146119.html
Copyright © 2020-2023  润新知