堆排序改进
上一篇是堆排序的简单过程,自认为下面这种更为合适:
思想:
1.建立大堆;
2.取堆顶元素和堆尾元素交换;(此时,大堆已破坏,需要重新往下调整,恢复大堆)
3.恢复大堆前,需要减掉已经在正确位置的堆尾元素;
代码如下:
#pragma once // //建立大堆, void AdjustUp(int *a, int index,int size) { int child = index * 2 + 1; while (child < size) { if ((child + 1) < size && a[child] < a[child + 1]) { ++child; } if (a[child] > a[(child - 1) / 2]) { swap(a[child], a[index]); index = child; child = index * 2 + 1; } else { break; } } } void HeapSort(int *a,int size) { assert(a); //建大堆 for (int i = (size - 2) / 2; i >= 0; --i) { AdjustUp(a,i,size); } //排序 for (int i = 0; i < size; ++i) //++i是因为控制后边的 保证每次最后一个数个堆顶数交换 { swap(a[0], a[size-1-i]); AdjustUp(a, 0,size-1-i); } }