您的位置:首页 > 其它

堆排序

2012-11-08 19:52 148 查看
堆排序只需要一个记录的辅助空间,代码中的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 );
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: