【数据结构】堆排序
2014-04-14 17:01
204 查看
给定一个整形数组a[]={16,7,3,20,17,8},对其进行堆排序。
首先根据该数组元素构建一个完全二叉树,得到
然后需要构造初始堆,则从最后一个非叶节点开始调整,调整过程如下:
然后20再与最后一个元素3交换位置,分离出20,得到了以3为根的一个新堆,再进行堆排序.依次分离出所有元素.
源码如下:
void heapAdjust(int a[], int s, int m)
{
int temp = a[s];
for (int j=2*s; j<=m; j*=2)
{
if (j<m && a[j] < a[j+1])
++j;
if(temp >= a[j])
break;
a[s] = a[j];
s = j;
}
a[s] = temp;
}
void heapSort(int a[], int n)
{
int i;
for (i=(n+1)/2; i>=0; i--)
heapAdjust(a, i, n-1);
for (i=n-1; i>0; i--)
{
swap(a[i], a[0]);
heapAdjust(a,0, i-1);
}
}
int main()
{
int a[10] = {0};
for(int i=0; i<10; i++)
{
a[i] = rand()%100+1;
cout << a[i] << " ";
}
cout << endl;
heapSort(a,10);
for(i=0; i<10; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
资料参考:http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html
首先根据该数组元素构建一个完全二叉树,得到
然后需要构造初始堆,则从最后一个非叶节点开始调整,调整过程如下:
然后20再与最后一个元素3交换位置,分离出20,得到了以3为根的一个新堆,再进行堆排序.依次分离出所有元素.
源码如下:
void heapAdjust(int a[], int s, int m)
{
int temp = a[s];
for (int j=2*s; j<=m; j*=2)
{
if (j<m && a[j] < a[j+1])
++j;
if(temp >= a[j])
break;
a[s] = a[j];
s = j;
}
a[s] = temp;
}
void heapSort(int a[], int n)
{
int i;
for (i=(n+1)/2; i>=0; i--)
heapAdjust(a, i, n-1);
for (i=n-1; i>0; i--)
{
swap(a[i], a[0]);
heapAdjust(a,0, i-1);
}
}
int main()
{
int a[10] = {0};
for(int i=0; i<10; i++)
{
a[i] = rand()%100+1;
cout << a[i] << " ";
}
cout << endl;
heapSort(a,10);
for(i=0; i<10; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
资料参考:http://www.cnblogs.com/dolphin0520/archive/2011/10/06/2199741.html
相关文章推荐
- 【算法与数据结构】图说堆排序
- 数据结构(5)优先级队列与堆排序
- 数据结构和算法16 之堆排序
- 【数据结构】浅谈算法和数据结构:优先队列和堆排序
- 数据结构之堆和堆排序
- 数据结构-排序-堆排序
- 【数据结构】将一组数据升序排序(利用堆排序)
- 算法和数据结构---排序---堆排序
- 数据结构复习之–“堆排序”-JAVA实现
- java数据结构 堆与堆排序
- 10-9-堆排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版
- 数据结构-排序算法详解(插入排序,希尔排序,堆排序,归并排序,快速排序,桶式排序)
- 【数据结构和算法】排序算法之二:选择排序和堆排序
- 复习数据结构:排序算法(六)——堆排序
- 【数据结构&&算法系列】堆排序简单介绍及其实现
- 数据结构 JAVA描述(十一) 选择排序(直接选择排序,树形选择排序,堆排序)
- 数据结构 - 堆排序
- 数据结构之堆排序
- 《常见算法和数据结构》优先队列(3)——堆排序
- 【数据结构】常用比较排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序)