堆是具有下列性質的完全二叉樹 : 每個節點的值都大於或等於其左右孩子節點的值 , 稱為大頂堆;或者每個節點的值都小於或等於其左右孩子節點的值 , 稱為小頂堆 .堆排序就是利用堆進行排序的方法 .
基本思想是 : 將待排序的序列構造成乙個大頂堆 . 此時 , 整個序列的最大值就是堆頂的根結點 . 將它移走 ( 其實就是將其與堆陣列的末尾元素交換 , 此時末尾元素就是最大值 ), 然後將剩餘的 n-1 個序列重新構造成乙個堆 , 這樣就會得到 n 個元素的次大值 . 如此反覆執行 , 便能得到乙個有序序列了.
時間複雜度為 o(nlogn), 好於冒泡 , 簡單選擇 , 直接插入的 o(n^2)
// 構造大頂堆
#define leftchild(i) (2*(i) + 1)
void percdown(int *arr, int i, int n)
arr[i] = tmp;
}void heapsort(int *arr, int n)
}int main(void) ;
heapsort(arr, 10);
for (int i = 0; i < 10; i++)
cout
<< arr[i] << ' ';
cout
<< endl;
return
0;}
一張圖看懂堆排序
//快速排序一次劃分演算法partition
int partition(int *a, int first, int end)
while (i < j && a[i] < a[j])
if (i < j)
}return i;
}//快速排序演算法
void quicksort(int *arr, int first, int end)
}
c 排序之堆排序
堆排序方法。待排序陣列。private void heapsort int a console.writeline r nmax heap in each iteration for int i a.length 1 i 0 i console.writeline string.empty 由底向上...
排序演算法之快速排序 歸併排序,堆排序
一趟排序 取區間內第乙個元素作為基準,將該元素放在適當的位置,此時基準數左邊的數都比它小,基準數右邊的數都比大。接下來便用同樣的方法分別對左右兩邊的資料進行排序,直到序列中沒有元素或只有乙個元素。int partition int a,int low,int high a low temp retu...
希爾排序,堆排序,快速排序
插入排序的改進演算法,不穩定的排序演算法,空間複雜度為o 1 public static void shellsort int a 氣泡排序的改進演算法,不穩定的排序演算法 空間複雜度在o log2n 和o n 之間 時間複雜度在o n 和o n2 之間,平均時間複雜度為o nlog2n 而當陣列初...