遞歸
public static void heapSort(int[] data) {
int size = data.length;
for (int i = 0; i < size; i++) {
createMaxdHeap(data, size - 1 - i);
swap(data, 0, size - 1 - i);
}
}
public static void createMaxdHeap(int[] data, int last) {
for(int i = (last-1)/2; i >= 0; i--){//找root節(jié)點(diǎn)
int tmp = i;
while(tmp * 2 + 1 <= last){
int big = tmp * 2 + 1;
if(big < last && data[big] < data[big+1]){//比較左孩子和右孩子,取較大的index
big++;
}
if(data[tmp] < data[big]){//把大的上升到root
swap(data,tmp,big);
tmp = big;
}else{
break;
}
}
}
}
public static void swap(int[] data, int i,int j){
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
非遞歸
public class Solution {
/**
* @param A an integer array
* @return void
*/
public void sortIntegers2(int[] A) {
// Write your code here
// 堆
heapSort(A);
}
static void heapSort( int[]a ){
for(int n=a.length;n>0;n--){
//n,i均表示的是位置,不是數(shù)組下標(biāo);從整個(gè)堆開(kāi)始,
for(int i=n/2;i>0;i--){
//比較父節(jié)點(diǎn)與子節(jié)點(diǎn)的值,將大的往上調(diào)
if((2* i< n)&&( a[ i-1]< a[2* i])){ //滿二叉樹(shù)
swap(a,i-1,2*i); // 不能使用swap(a[i-1],a[2*i]),因?yàn)閿?shù)組傳遞不過(guò)去,不能對(duì)數(shù)組元素值進(jìn)行處理
}
if( a[ i-1]< a[2* i-1]){
swap(a,i-1,2*i-1);
}
}
swap(a ,0,n -1); //每次找到最大值存儲(chǔ)在最末的位置
}
}
public static void swap(int[] data, int i,int j){
int tmp = data[i];
data[i] = data[j];
data[j] = tmp;
}
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。