C++堆排序算法的实现方法_C 语言

 本文诉讼手续忠告了C++取得堆排序算法的办法,信任四处走动的每个人背诵数据排列与算法会起到必然的帮忙功能。具体的内容如次:

 率先,鉴于堆排序算法说起来对比地长,因而在这一点上就告诉我。堆排序是一种树形选择排序办法,它的怪癖是:在排序程序,L的[ ]是单独达到结尾的的按次蓄电排列的两,应用完整二叉树中双亲混合的和孩子混合的中间的内在相干,在眼前的使凌乱区域选择关头词最大(或最小。

一、堆的规定

堆的规定如次:n关头词序列L [ ]译成一堆,假如序列心甘情愿的:
①L(i) <= L(2i)和L(我) <= L(2i+1)  或者  ②L(i) >= L(2i)和L(我) >= L(2i+1)   属于[ 1我, n/2]。

心甘情愿的第①种健康状况的堆称为小根堆(小顶堆),心甘情愿的第②种健康状况的堆称为大根堆(大顶堆)。在根桩,在根混合的中蓄电的最大元,和一点非根混合的,它的值以内或势均力敌的其父混合的值。。相反的小堆,一小堆蓄电根混合的的最小元素。譬如,{ 16, 14, 10, 8, 7, 9, 3, 2 }说的根桩:

                                 

二、初始排列的堆

堆排序的关头执意初始排列的堆。n中有两个树混合的,经受住单独混合的是在N / 2(滑降取整)的子混合的。因而初始排列的堆的工艺流程是:N / 2(滑降取整)为每优美的体型否决者的混合的(在根桩状况,大他的混合的以内约在关头词的孩子,互通式立体交叉),使子树译成堆。自己谋生后从N / 2-1翻开1混合的的每优美的体型否决者,混合的的值大于子混合的的值,若不是,在更大的有重要性和互通式立体交叉的孩子,互通式立体交叉后可以在一堆毁灭,因而持续应用是你这么说的嘛!办法一堆排列下,直到该混合的的子树的根的单独堆为止。采取是你这么说的嘛!办法反复地整洁的堆桩破土,直到根混合的。

因阻塞切中要害下标从0开端,因而在一堆我距孩子2 *我 1,对孩子2 *我 2。以下是单独算法,整洁的堆的取得:

void AdjustDown(ElementType A[], int i, int Len) 
{ 
  ElementType temp = 单独[我] // 暂时的单独[我] 
   
  为(int largest=2*i+1; largest单独[大] 
      ++largest;     // 假如对孩子大 
    假如(气温 < 单独[大] 
    { 
      单独[我] = A[largest]; 
      i = largest;     // 记录互通式立体交叉后的位置 
    } 
    else 
      break; 
  } 
  单独[我] = temp;  // 被筛选结点的值放入最终位置 
} 

 

建堆,从N / 2(滑降取整)为1的混合的滑降整洁的,自然,因阻塞下标从0开端,因而:

void BuildMaxHeap(ElementType A[], int Len) 
{ 
  为(int i=len/2-1; i>=0; --i) // 从我= N / 2-1 0,反复地整洁的堆 
    AdjustDown(A, i, Len); 
} 

三、堆排序

初始排列的堆成晚年的,对堆排序的思惟很复杂:第单独将蓄电在L n n中,结构初始堆栈元素。,鉴于桩自己的怪癖(大根桩为例,堆栈的顶部是最大的元素。的出口堆顶元素后,通常,桩底到堆顶元素,根混合的已不克不及心甘情愿的巨型根桩的机能,堆被毁灭。这将使桩顶滑降整洁的元件供养机能,栈顶,之后出口元素。这样反复,直到堆单独地整体的。该算法的取得如次:

void HeapSort(ElementType A[], int n) 
{ 
  BuildMaxHeap(A, n);    // 堆的初始进化 
  为(int i=n-1; i>0; --i) // n-1次互通式立体交叉程序  
  { 
    // 在堆顶元素的最大出口(和地下室的交流 
    单独[ 0 ] = 单独[ 0 ]^单独[我] 
    单独[我] = 单独[ 0 ]^单独[我] 
    单独[ 0 ] = 单独[ 0 ]^单独[我] 
    // 整洁的,对整桩其他n-1个元素 
    AdjustDown(A, 0, i);   
  } 
} 

四、机能剖析

时期复合物:的滑降整洁的的时期和海拔高度,为O(h)。可以显示n个一系列切中要害元素总计在构造上。,其时期复合物为O(n)。之后有单独滑降滑降运转,每回整洁的时期为o(h),故在最好,最差和相等地,堆排序的时期复合物为O(nlogn)。

以一定间隔排列复合物:单独地单独忠实的的辅佐方法,以一定间隔排列复合物为o(1)。。

稳定性:愉快活跃的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注