004 選擇排序 堆排序(Heap Sort)

2021-08-21 04:53:20 字數 3306 閱讀 8395

(即第乙個元素)必為最小項(小頂堆)。

若以一維陣列儲存乙個堆,則堆對應一棵完全二叉樹,且所有非葉結點的值均不大於(或不小於)其子女的值,根結點(堆頂元素)的值是最小(或最大)的。如:

,調整它們的儲存序,使之成為乙個堆,將堆頂元素輸出,得到n 個元素中最小(或最大)的元素,這時堆的根節點的數最小(或者最大)。然後對前面(n-1)個元素重新調整使之成為堆,輸出堆頂元素,得到n 個元素中次小(或次大)的元素。依此類推,直到只有兩個節點的堆,並對它們作交換,最後得到有n個節點的有序序列。稱這個過程為堆排序

。調整小頂堆的方法:

建堆方法:對初始序列建堆的過程,就是乙個反覆進行篩選的過程。

void

print(

inta, 

intn)  

cout<}  

/*** 已知h[s…m]除了h[s] 外均滿足堆的定義

* 調整h[s],使其成為大頂堆.即將對第s個結點為根的子樹篩選, 

** @param h是待調整的堆陣列

* @param s是待調整的陣列元素的位置

* @param length是陣列的長度**/

void

heapadjust(

inth,

ints, 

intlength)  

if(h[s]// 如果較大的子結點大於父結點

h[s] = h[child]; // 那麼把較大的子結點往上移動,替換它的父結點

s = child;       // 重新設定s ,即待調整的下乙個結點的位置

child = 2*s+1;  

}  else

h[s] = tmp;         // 當前待調整的結點放到比其大的孩子結點位置上

}  print(h,length);  

}  /**

* 初始堆進行調整

* 將h[0..length-1]建成堆

* 調整完之後第乙個元素是序列的最小的元素

*/void

buildingheap(

inth, 

intlength)  

/*** 堆排序演算法

*/void

heapsort(

inth,

intlength)  

}   

intmain();  

cout<<"初始值:"

;  print(h,10);  

heapsort(h,10);  

//selectsort(a, 8);

cout<<"結果:"

;  print(h,10);  

}  void

print(

inta, 

intn)  

cout<}  

/*** 已知h[s…m]除了h[s] 外均滿足堆的定義

* 調整h[s],使其成為大頂堆.即將對第s個結點為根的子樹篩選, 

** @param h是待調整的堆陣列

* @param s是待調整的陣列元素的位置

* @param length是陣列的長度**/

void

heapadjust(

inth,

ints, 

intlength)  

if(h[s]// 如果較大的子結點大於父結點

h[s] = h[child]; // 那麼把較大的子結點往上移動,替換它的父結點

s = child;       // 重新設定s ,即待調整的下乙個結點的位置

child = 2*s+1;  

}  else

h[s] = tmp;         // 當前待調整的結點放到比其大的孩子結點位置上

}  print(h,length);  

}  /**

* 初始堆進行調整

* 將h[0..length-1]建成堆

* 調整完之後第乙個元素是序列的最小的元素

*/void

buildingheap(

inth, 

intlength)  

/*** 堆排序演算法

*/void

heapsort(

inth,

intlength)  

}   

intmain();  

cout<<"初始值:"

;  print(h,10);  

heapsort(h,10);  

//selectsort(a, 8);

cout<<"結果:"

;  print(h,10);  

}  void

print(

inta, 

intn)  

cout<}  

/** * 已知h[s…m]除了h[s] 外均滿足堆的定義

* 調整h[s],使其成為大頂堆.即將對第s個結點為根的子樹篩選, 

* * @param h是待調整的堆陣列

* @param s是待調整的陣列元素的位置

* @param length是陣列的長度

* */

void

heapadjust(

inth,

ints, 

intlength)  

if(h[s]// 如果較大的子結點大於父結點

h[s] = h[child]; // 那麼把較大的子結點往上移動,替換它的父結點

s = child;       // 重新設定s ,即待調整的下乙個結點的位置

child = 2*s+1;  

}  else

h[s] = tmp;         // 當前待調整的結點放到比其大的孩子結點位置上

}  print(h,length);  

}  /**

* 初始堆進行調整

* 將h[0..length-1]建成堆

* 調整完之後第乙個元素是序列的最小的元素

*/ void

buildingheap(

inth, 

intlength)  

/*** 堆排序演算法

*/ void

heapsort(

inth,

intlength)  

}   

intmain();  

cout<<"初始值:"

;   print(h,10);  

heapsort(h,10);  

//selectsort(a, 8);

cout<<"結果:"

;   print(h,10);  

}  

排序 選擇排序 選擇排序 堆排序

寫在前面 上傳github交換排序選擇排序 堆排序 選擇排序 顧名思義,我們就可以猜到,它是原則合適的元素放到合適的位置 從圖中,我們可以得到 1.用第乙個元素,和其他所有的元素進行比較,找出最小的,然後進行交換 2.然後進行,資料的遞增 3.直到資料全部有序 void selectsort int...

選擇排序 堆排序

選擇排序 selection sort 是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小 或最大 的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。選擇排序是不穩定的排序方法 比如序列 5,5,3 第一次就將第乙個 5 與 3 交換,導致第乙個5挪動到第二個...

選擇排序 堆排序

堆排序 堆排序分為兩個過程 1 將原來無序的數列,轉化成堆序列 建初識堆的過程 2 輸出堆頂元素並調整建新堆的過程 資料結構偽 typeof sqlist heaptype void heapadjuisti heaptype h,int s int m for i h.length i 1 i c...