堆排序

来源:互联网 发布:matlab 矩阵拼接 编辑:程序博客网 时间:2024/05/16 01:07

堆排序只需要一个记录的辅助空间,代码中的tmp。

代码中的数组第一个元素a[0],没参与排序,需要排序的元素从1开始,这样代码的逻辑更容易理解(a[i] > a[2i] && a[i] > a[2i + 1] ) || (a[i] < a[2i] && a[i] < a[2i + 1])。i = (1, 2, ... [n/2])

时间复杂度为nlogn, 最坏的情况下也是如此,这是比快排有优势的地方。

#include <iostream>using namespace std;void heapAdjust( int a[], int s, int length){int tmp = a[s];for (int j = 2*s; j<= length; j = 2*j){if ( j < length && a[j] < a[j + 1]){j++;}if (tmp >= a[j]){ break;}a[s] = a[j];s = j;}a[s] = tmp;}void heapSort(int a[], int length){int i = 0;for (i = length/2; i >= 0; i--){heapAdjust(a, i, length);}int tmp = 0;for (i = length; i > 0; i--){tmp = a[i];a[i] = a[1];a[1] = tmp;heapAdjust(a, 1, i - 1);}}void print(const int a[], int &n){for (int i = 0; i < n; i++){cout << a[i] << " ";}cout << endl;}int main(int argc, char * argv[]){int a[] = {1230, 12, 31, 3, 324, 23, 43, 78, 100};int size = sizeof(a)/sizeof(int);cout << "before sort:" << endl;print(a, size );heapSort(a, size - 1);cout << "after sort:" << endl;print(a, size );}