C 複習之堆排序 快速排序

2021-07-15 21:26:14 字數 1023 閱讀 4740

堆是具有下列性質的完全二叉樹 : 每個節點的值都大於或等於其左右孩子節點的值 , 稱為大頂堆;或者每個節點的值都小於或等於其左右孩子節點的值 , 稱為小頂堆 .堆排序就是利用堆進行排序的方法 .

基本思想是 : 將待排序的序列構造成乙個大頂堆 . 此時 , 整個序列的最大值就是堆頂的根結點 . 將它移走 ( 其實就是將其與堆陣列的末尾元素交換 , 此時末尾元素就是最大值 ), 然後將剩餘的 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 而當陣列初...