v8
This commit is contained in:
38
lib/v9/pages/sort/functions/heap.dart
Normal file
38
lib/v9/pages/sort/functions/heap.dart
Normal file
@@ -0,0 +1,38 @@
|
||||
import '../functions.dart';
|
||||
|
||||
///堆排序
|
||||
Future<void> heapSort(List<int> src, SortCallback callback) async {
|
||||
// 从最后一个非叶子节点开始,构建最大堆
|
||||
for (int i = src.length ~/ 2; i >= 0; i--) {
|
||||
await heapify(src,callback, src.length, i);
|
||||
}
|
||||
|
||||
// 依次取出最大堆的根节点(最大值),并进行堆化
|
||||
for (int i = src.length - 1; i >= 0; i--) {
|
||||
int temp = src[0];
|
||||
src[0] = src[i];
|
||||
src[i] = temp;
|
||||
await heapify(src, callback,i, 0);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> heapify(List<int> src, SortCallback callback, int n, int i) async{
|
||||
int largest = i;
|
||||
int l = 2 * i + 1; // 左子节点索引
|
||||
int r = 2 * i + 2; // 右子节点索引
|
||||
|
||||
// 如果左子节点存在并且大于父节点,则更新最大值索引
|
||||
if (l < n && src[l] > src[largest]) largest = l;
|
||||
|
||||
// 如果右子节点存在并且大于父节点或左子节点,则更新最大值索引
|
||||
if (r < n && src[r] > src[largest]) largest = r;
|
||||
|
||||
// 如果最大值索引不等于当前节点索引,则交换节点值,并递归进行堆化
|
||||
if (largest != i) {
|
||||
int temp = src[i];
|
||||
src[i] = src[largest];
|
||||
src[largest] = temp;
|
||||
heapify(src,callback, n, largest);
|
||||
}
|
||||
await callback(src);
|
||||
}
|
||||
Reference in New Issue
Block a user