(即第乙個元素)必為最小項(小頂堆)。
若以一維陣列儲存乙個堆,則堆對應一棵完全二叉樹,且所有非葉結點的值均不大於(或不小於)其子女的值,根結點(堆頂元素)的值是最小(或最大)的。如:
,調整它們的儲存序,使之成為乙個堆,將堆頂元素輸出,得到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...