堆排序 一个综合了插入排序和二路归并特点的排序算法(未测试)

来源:互联网 发布:绝地求生辅助网站源码 编辑:程序博客网 时间:2024/05/22 02:23
/*1.学习怎么使用 堆排序   1.1堆排序让我觉得最重要的是维护堆性质的这部分   效率是lgn   在我脑海中的维护堆性质的图任然是很清晰, 因为它的重要性贯彻了整个排序 1.2其次就是创建最大堆,  创建最大堆是将数组中的数据以最大堆的性质展现出来,然后可以拿到最大值,创建最大堆的效率准确    的上届是n       1.3这个就是讲数组通过最大堆的形式表现出来  综合如上方法 形成堆排序 */ 
 
 
 
 
void maxHeap(int a[],int i ){     int theMax =i;//这是为了记住最大值的下标  便于往下维护  //父节点为i 的话,那么孩子节点就应该为 2i与2*i+1     //堆是建立完全二叉树 if(2*i > strlen(a)){     //如果是叶子节点的话   我直接跳出来  return ; } //判断哪个值更大  if((2*1+1)<strlen(a) && a[2*i+1]>a[i] && a[2*i+1] >a[2*i] ){     theMax = 2*i+1;    }else if(a[2*i] > a[i]){     theMax  = 2* i ;  }  if(i < theMax){     a[i]=a[i]^a[theMax];  //这是按位异或做的值的交换  a[theMax] = a[i]^a[theMax];  a[i]  = a[i]^a[theMax];     maxHeap(a,theMax);  }}


 

/*
  这是维护堆性质的方法
    通过我脑子的图像 维护主要是父节点和孩子节点的比较过程
  如果不孩子大的话就不需要维护了
  如果比孩子小的话 和孩子交换值,并往下维护
    输入  是一个待排序的数组   和需要维护的节点
 
*/

/*
  创建最大堆在我的脑海中图是先从最后一个父节点开始,来维护堆性质,直到维护到第一个节点才成为了最大的堆
  输入:  是是一个待创建成最大堆的数组,  first是起始(一般为0 ),end是结束 
*/

void createMaxHeap(int a[],int first ,int end ){     int startParent  =  end/2; //这是第一个父亲节点的下标  while(startParent>=first){      maxHeap(a,startParent);//去维护堆 直到为first    startParent--;  }}


 


/*
    真正的堆排序 ,在我脑海中的图像是  首先是一个最大堆,然后抽取最大值下来,注意是第一个与最后一个交换
  便于维护。
   然后是缩短最大堆的大小,重复这个动作,直到为  1
   循环不变式就是上面的
*/

void heapSort(a[]){    createMaxHeap(a,0,strlen(a)); //首先就是创建最大堆    int heapSize = strlen(a);  //最大堆的大小 a[heapSize-1] = a[0];    //交换值  heapSize--;    while(heapSize>1){     //当堆的值小到只有一个的时候  那肯定是最小的值了       
  maxHeap(a,0);     //维护堆
   a[heapSize-1]=a[0];   heapSize--;
   
 
 }
  }



 

原创粉丝点击