【数据结构】八大排序算法---堆排序

选择排序:简单选择排序和堆排序

堆排序:满足完全二叉树

【数据结构】八大排序算法---堆排序_第1张图片

(升序)大顶堆: 堆顶元素大于左右孩子的数据

(降序)小顶堆:堆顶元素小于左右孩子的数据

升序排序的方法:

  1. 把当前堆按大顶堆排序
  2. 当前堆顶的元素放到当前堆的末尾元素,把最大的元素排列有序
  3. 堆中的元素个数总体减1
  4. 重新按大顶堆排序
  5. 当大顶堆的堆顶放了重新组织后的堆中的最大的元素,再和末尾位置交换,重复整个过程

如何把堆排序成大顶堆:

  1. 在左右孩子中找较大的数据
  2. 在父亲和左右孩子中找较大的数据比较,如果父亲结点小于左右孩子,则交换,否则不做任何处理

【数据结构】八大排序算法---堆排序_第2张图片

代码实现: 

void ShoeArr(int arr[],int len)
{
   int i=0;
   for(i;iarr[j]))//有左孩子且有右孩子的情况下,右孩子大于左孩子
      {
        j++;
      }//j已经标识左右孩子较大的数据
      if(arr[i]>arr[j])//父亲结点大于左右孩子较大值
      {
         break;
      }
      tmp=arr[i];
      arr[i]=arr[j];
      arr[j]=tmp;

      i=j;/i父亲结点的位置标识到 左右孩子中发生调整的支路
   }
}
void HeapSort(int arr[],int len)//排序
{
   int i=(len-2)/2;//标识最后一个父亲结点的位置
   int tmp;
   for(i;i>=0;i--)
   {
      HeapAdjust(arr,i,len);
   }
   for(i=len-1;i>0;i--)//i标识最后一个元素的下标
   { 
      tmp=arr[i];
      arr[i]=arr[0];
      arr[0]=tmp;
      HeapAdjust(arr,0,i);//重新建大顶堆
   }
}

int main()
{
   int arr[]={12,3,21,32,1,34,12,35,34,18};
   int len=sizeof(arr)/sizeof(arr[0]);
   ShoeArr(arr,len);
   HeapSort(arr,len);
   ShoeArr(arr,len);
   rerurn 0;
}

时间复杂度:O(n*log2n)

空间复杂度: O(1)

稳定性:不稳定

 

 

 

你可能感兴趣的:(【数据结构】八大排序算法---堆排序)