/**
*實現堆排序[原地堆排序]
*堆適用於動態資料的維護,不適合系統級的排序
*時間複雜度o(nlogn),從小到大排序,前兩種堆排序均開闢了額外空間
*不需開闢額外空間,也不需為額外空間進行處理,所以,空間複雜度為o(1)
*根節點從0開始,左孩子:2i+1,右孩子2i+2;
*/
public
class heapsort3
//從小到大排序,
for(int i=n-1;i>0;i--)
}private
void __shiftdown(int arr, int n, int i)
if(arr[i]>=arr[j])
break;
swap(arr,i,j);
i=j;}}
private
void
swap(int arr, int i, int j)
}public
static
void
main(string args) ;
int n=arr.length;
heapsort3 sort3=new heapsort3();
sort3.heapsort3(arr, n);
for(int i=0;iout.print(arr[i]+" ");
}}
原地堆排序
siwuxie095 原地堆排序 程式 1 原地堆排序的實現 sorttesthelper.h ifndef sorttesthelper h define sorttesthelper h include include include include include using namespac...
原地堆排序
上一節講的兩種堆排序都需要開闢o n 的輔助空間 建構函式中使用new分配的輔助空間 程式在開闢輔助空間和釋放空間的時候也會消耗一定的時間,若能多陣列進行原地堆排序,則省去了開闢和釋放空間的時間,時間效能會好一些。給定乙個大小為n的陣列,將這個陣列heapify,變為最大堆,此時陣列的第乙個元素就是...
原地堆排序
堆排序 我之前使用的堆排序是要開 乙個長度為 n的陣列,事實上,我們可以把原陣列看成乙個堆,也就是說我們不用開乙個陣列,而是在原地排序 怎麼說呢 還是給我乙個陣列,我對這個陣列進行heapify 操作,這樣就得到了乙個大根堆 腦袋是最大的 然後我們把最大的那個數和陣列的最後乙個元素交換,這樣一來,陣...