标签:style blog color io os ar for div sp
C++代码 1:
#include <iostream> #include <assert.h> using namespace std; //调整堆 //s:需要调整的非终端节点的位序 //len:整个待排序数组的长度 void HeapAdjust(int a[], int s, int len) { int tmp = a[s]; for(int i=s*2; i<=len; i=i*2) { int largeIndex = i; if(i+1 <= len && a[i+1] > a[i]) { largeIndex = i+1; } if(tmp < a[largeIndex]) { a[s] = a[largeIndex]; s = largeIndex; } } a[s] = tmp; } void HeapSort(int a[], int len) { //构建大根堆 for(int i=len/2; i>=1; i--) { HeapAdjust(a, i, len); } //堆排序 for(int i=len; i>=1; i--) { //交换每次调整后的堆的相应的第一个元素和最后一个元素 int tmp = a[i]; a[i] = a[1]; a[1] = tmp; HeapAdjust(a, 1, i-1); } } int main() //堆排序,构建大根堆排序,输出数组元素的非递减序列 //首先构建大根堆,然后交换根元素和最后一个元素->调整剩余的(n-1)个元素为新的大根堆,如此反复直到排序结束(即只剩下最后一个未排序元素) { int a[] = {0, 29, 345, 11, 3, 4, 899, 8, 1014};//因为堆排序的第一个元素序号为1,而数组的第一个元素序号为0,这里添加一个无用的首元素"0" int len = sizeof(a) / sizeof(int); cout << "----original----" << endl; for(int i=1; i<len; i++) cout << a[i] << " "; cout << endl; HeapSort(a, len-1); cout << "----result----" << endl; for(int i=1; i<len; i++) cout << a[i] << " "; cout << endl; cin.get(); cin.get(); return 0; }
C++代码 2 :用递归方式实现调整堆
#include <iostream>
#include <assert.h>
using namespace std;
//调整堆
//s:需要调整的非终端节点的位序
//len:整个待排序数组的长度
void HeapAdjust(int a[], int s, int len)
{
int largeIndex = s;
int leftChildIndex = 2*s;
if(leftChildIndex<=len && a[s]<a[leftChildIndex])
{
largeIndex = leftChildIndex;
}
int rightChildIndex = 2*s + 1;
if(rightChildIndex<=len && a[s]<a[rightChildIndex] && a[leftChildIndex]<a[rightChildIndex])
{
largeIndex = rightChildIndex;
}
if(largeIndex != s)
{
int tmp = a[largeIndex];
a[largeIndex] = a[s];
a[s] = tmp;
//用递归方式实现调整堆
HeapAdjust(a, largeIndex, len);
}
}
void HeapSort(int a[], int len)
{
//构建大根堆
for(int i=len/2; i>=1; i--)
{
HeapAdjust(a, i, len);
}
//堆排序
for(int i=len; i>=1; i--)
{
//交换每次调整后的堆的相应的第一个元素和最后一个元素
int tmp = a[i];
a[i] = a[1];
a[1] = tmp;
HeapAdjust(a, 1, i-1);
}
}
int main() //堆排序,构建大根堆排序,输出数组元素的非递减序列
//首先构建大根堆,然后交换根元素和最后一个元素->调整剩余的(n-1)个元素为新的大根堆,如此反复直到排序结束(即只剩下最后一个未排序元素)
{
int a[] = {0, 29, 345, 11, 3, 4, 899, 8, 1014};//因为堆排序的第一个元素序号为1,而数组的第一个元素序号为0,这里添加一个无用的首元素"0"
int len = sizeof(a) / sizeof(int);
cout << "----original----" << endl;
for(int i=1; i<len; i++)
cout << a[i] << " ";
cout << endl;
HeapSort(a, len-1);
cout << "----result----" << endl;
for(int i=1; i<len; i++)
cout << a[i] << " ";
cout << endl;
cin.get();
cin.get();
return 0;
}
标签:style blog color io os ar for div sp
原文地址:http://www.cnblogs.com/wenwujuncheng/p/3970398.html