堆是一種非常有用的資料結構,我們可以利用大頂堆或者小頂堆這種資料結構完成堆排序,但是這樣會增加o(n)的輔助空間,其實,真正的堆排序是可以在原地進行的,我們稱之為原地堆排序,今天我們就來實現一下原地堆排序吧。
原地堆排序主要分兩個步驟:
1. 對陣列進行堆化
2. 將最大元素與陣列末端元素交換,然後對前n-1個元素繼續堆化。
具體**為:
#include #include using namespace std;
templatevoid __shiftdown(t arr, int n, int k)
}templatevoid heapsort(t arr, int n)
}
和直接插入排序類似,一次swap包含三次賦值操作,我們可以將shiftdown函式中的swap操作換成賦值操作。**如下:
#include #include using namespace std;
templatevoid __shiftdown2(t arr, int n, int k)
arr[k] = e;
}templatevoid heapsort(t arr, int n)
}
堆排序,cpp實現
include using namespace std void swap int a,int b 初始建堆,實為對孩子所在列的插入排序 void buildheap int a,int length 在每次刪除頂部元素後恢復堆,本質上從頂部開始,和左右孩子較大的孩子交換,一直到不能交換為止,時間效...
原地堆排序
siwuxie095 原地堆排序 程式 1 原地堆排序的實現 sorttesthelper.h ifndef sorttesthelper h define sorttesthelper h include include include include include using namespac...
原地堆排序
上一節講的兩種堆排序都需要開闢o n 的輔助空間 建構函式中使用new分配的輔助空間 程式在開闢輔助空間和釋放空間的時候也會消耗一定的時間,若能多陣列進行原地堆排序,則省去了開闢和釋放空間的時間,時間效能會好一些。給定乙個大小為n的陣列,將這個陣列heapify,變為最大堆,此時陣列的第乙個元素就是...