<address id="ousso"></address>
<form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
  1. 內部排序之堆排序的實現

    時間:2025-11-01 21:24:22 C語言

    內部排序之堆排序的實現

      堆排序(Heap Sort)只需要一個記錄大小的輔助空間,每個待排序的記錄僅占有一個存儲空間。下面小編為大家整理了內部排序之堆排序的實現,希望能幫到大家!

      (1)基本概念

      a)堆:設有n個元素的序列:

      {k1, k2, ..., kn}

      對所有的i=1,2,...,(int)(n/2),當滿足下面關系:

      ki≤k2i,ki≤k2i+1

      或 ki≥k2i,ki≥k2i+1

      這樣的序列稱為堆。

      堆的兩種類型:

      根結點最小的堆----小根堆。

      根結點最大的堆----大根堆。

      根結點稱為堆頂,即:在一棵完全二叉樹中,所有非葉結點的值均小于(或均大于)左、右孩子的值。

      b)堆排序:是一種樹型選擇排序,特點是,在排序過程中,把R[1..n]看成是一個完全二叉樹的存儲結構,利用完全二叉樹雙親結點和孩子結點的內在關系,在當前無序區中選擇關鍵字最大(最小)的記錄。

      (2)堆排序步驟:

      1、從k-1層的最右非葉結點開始,使關鍵字值大(或小)的記錄逐步向二叉樹的上層移動,最大(或小)關鍵字記錄成為樹的根結點,使其成為堆。

      2、逐步輸出根結點,令r[1]=r[i](i=n,,n-1,...,2),在將剩余結點調整成堆。直到輸出所有結點。我們稱這個自堆頂到葉子的調整過程為“篩選”。

      (3)要解決的兩個問題:

      1、如何由一個無序序列建成一個堆;

      2、輸出一個根結點后,如何將剩余元素調整成一個堆。

      將一個無序序列建成一個堆是一個反復“篩選”的過程。若將此序列看成是一個完全二叉樹,則最后一個非終端結點是第floor(n/2)個元素,由此“篩選”只需從第floor(n/2)個元素開始。

      堆排序中需一個記錄大小的輔助空間,每個待排的記錄僅占有一個存儲空間。堆排序方法當記錄較少時,不值得提倡。當n很大時,效率很高。堆排序是不穩定的。

      堆排序的算法和篩選的算法如第二節所示。為使排序結果是非遞減有序排列,我們在排序算法中先建一個“大頂堆”,即先選得一個關鍵字為最大的記錄并與序列中最后一個記錄交換,然后對序列中前n-1個記錄進行篩選,重新將它調整為一個“大頂堆”,然后將選得的一個關鍵字為最大的記錄(也就是第一個元素)與當前最后一個記錄交換(全局看是第n-1個),如此往復,直到排序結束。由到,篩選應按關鍵字較大的孩子結點向下進行。

      堆排序的算法描述如下:

      用C語言代碼實現如下:

      復制代碼 代碼如下:

      #include "iostream"

      using namespace std;

      #define MAXSIZE 20

      typedef struct

      {

      int key;

      /pic/p>

      }RedType;

      typedef struct

      {

      RedType r[MAXSIZE+1];

      int length;

      }Sqlist;

      typedef Sqlist HeapType; /pic/p>

      void HeapAdjust(HeapType &H,int s,int m) /pic/p>

      {

      int j;

      RedType rc;

      rc=H.r[s];

      for(j=2*s;j<=m;j*=2) /pic/p>

      {

      if(j<m && (H.r[j].key<H.r[j+1].key)) /pic/p>

      ++j;

      if(rc.key>=H.r[j].key) /pic/p>

      break;

      H.r[s]=H.r[j]; /pic/p>

      s=j;

      }

      H.r[s]=rc; /pic/p>

      }

      void HeapSort(HeapType &H) /pic/p>

      {

      int i;

      for(i=H.length/2;i>0;--i) /pic/2個元素

      HeapAdjust(H,i,H.length);

      for(i=H.length;i>1;--i)

      {

      H.r[0]=H.r[1]; /pic/p>

      H.r[1]=H.r[i];

      H.r[i]=H.r[0];

      HeapAdjust(H,1,i-1); /pic/p>

      }

      }/pic/p>

      void InputL(Sqlist &L)

      {

      int i;

      printf("Please input the length:");

      scanf("%d",&L.length);

      printf("Please input the data needed to sort:n");

      for(i=1;i<=L.length;i++) /pic/p>

      scanf("%d",&L.r[i].key);

      }

      void OutputL(Sqlist &L)

      {

      int i;

      printf("The data after sorting is:n");

      for(i=1;i<=L.length;i++)

      printf("%d ",L.r[i].key);

      printf("n");

      }

      int main(void)

      {

      Sqlist H;

      InputL(H);

      HeapSort(H);

      OutputL(H);

      system("pause");

      return 0;

      }

      不使用上面的結構體的另外一種方法如下:

      復制代碼 代碼如下:

      /*

      *堆排序

      */

      #include "iostream"

      using namespace std;

      #define N 10

      int array[N];

      void man_input(int *array)

      {

      int i;

      for(i=1;i<=N;i++)

      {

      printf("array[%d]=",i);

      scanf("%d",&array[i]);

      }

      }

      void mySwap(int *a,int *b)/pic/p>

      {

      int temp;

      temp=*a;

      *a=*b;

      *b=temp;

      }

      void heap_adjust(int *heap,int root,int len) /pic/p>

      {

      int i=2*root;

      int t=heap[root];

      while(i<=len)

      {

      if(i<len)

      {

      if(heap[i]<heap[i+1])

      i++;

      }

      if(t>=heap[i])

      break;

      heap[i/2]=heap[i];

      i=2*i;

      }

      heap[i/2]=t;

      }

      void heapSort(int *heap,int len) /pic/p>

      {

      int i;

      for(i=len/2;i>0;i--) /pic/2個元素

      {

      heap_adjust(heap,i,len);

      }

      for(i=len;i>=1;i--)

      {

      mySwap(heap+i,heap+1); /pic/p>

      heap_adjust(heap,1,i-1); /pic/p>

      }

      }

      void print_array(int *array,int n)

      {

      int k;

      for(k=1;k<n+1;k++)

      {

      printf("%dt",array[k]);

      }

      }

      int main(void)

      {

      man_input(array);

      heapSort(array,N);

      printf("nAfter sorted by the heap_sort algorithm:n");

      print_array(array,N); /pic/p>

      system("pause");

      return 0;

      }

    【內部排序之堆排序的實現】相關文章:

    C#排序算法之堆排序11-16

    堆排序算法及用C++實現基于最大堆的堆02-12

    java堆排序的算法思想的分析11-29

    php如何實現快速排序09-11

    如何實現歸并排序03-14

    分析php選擇排序法實現數組排序的方法12-13

    希爾排序(C語言實現)01-26

    冒泡排序(C語言實現)12-01

    C#排序算法之快速排序01-07

    <address id="ousso"></address>
    <form id="ousso"><track id="ousso"><big id="ousso"></big></track></form>
    1. 日日做夜狠狠爱欧美黑人