排序算法总结4-堆排序
2013-06-07 16:40
316 查看
堆排序的主要步骤:
1 根据数组,从非叶子结点开始,建立最大(小)堆。
2 交换第一个结点和最后一个结点的数据,此时最后一个结点即为最大(小)值。此时前面n-1个数据重新调整堆。按此循环到结束。
#include<stdio.h>
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void printout(int a[],int n)
{
int i;
for(i = 0; i < n; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
void maxheapdown(int a[],int i,int n)//
{
int j,temp;
temp = a[i];
j = 2*i + 1;
while(j < n)
{
if(j + 1 < n && a[j+1] > a[j]) //先在左右孩子中找最大的结点
j++;
if(a[j] > temp)
{
a[i] = a[j];
i = j;
j = 2*i + 1;
//a[i] = temp;
}
if(a[j] <= temp)
break;
}
a[i] = temp;
}
void buildmaxheap(int a[], int n)
{
int i;
for(i = n/2 -1; i >= 0; i--)
{
maxheapdown(a,i,n);
}
printf("build:");
printout(a,n);
}
void maxheapsort(int a[],int n)
{
int i;
for(i = n-1; i >=0; i--)
{
swap(&a[0],&a[i]);
maxheapdown(a,0,i);
}
printout(a,n);
}
int main()
{
int data2[5] = {2,4,3,5,6};
buildmaxheap(data2,5);//先创建堆
maxheapsort(data2,5);
}
堆排序的最坏时间复杂度为O(nlogn)。堆序的平均性能较接近于最坏性能。
由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
堆排序是就地排序,辅助空间为O(1),
它是不稳定的排序方法。
1 根据数组,从非叶子结点开始,建立最大(小)堆。
2 交换第一个结点和最后一个结点的数据,此时最后一个结点即为最大(小)值。此时前面n-1个数据重新调整堆。按此循环到结束。
#include<stdio.h>
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void printout(int a[],int n)
{
int i;
for(i = 0; i < n; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
void maxheapdown(int a[],int i,int n)//
{
int j,temp;
temp = a[i];
j = 2*i + 1;
while(j < n)
{
if(j + 1 < n && a[j+1] > a[j]) //先在左右孩子中找最大的结点
j++;
if(a[j] > temp)
{
a[i] = a[j];
i = j;
j = 2*i + 1;
//a[i] = temp;
}
if(a[j] <= temp)
break;
}
a[i] = temp;
}
void buildmaxheap(int a[], int n)
{
int i;
for(i = n/2 -1; i >= 0; i--)
{
maxheapdown(a,i,n);
}
printf("build:");
printout(a,n);
}
void maxheapsort(int a[],int n)
{
int i;
for(i = n-1; i >=0; i--)
{
swap(&a[0],&a[i]);
maxheapdown(a,0,i);
}
printout(a,n);
}
int main()
{
int data2[5] = {2,4,3,5,6};
buildmaxheap(data2,5);//先创建堆
maxheapsort(data2,5);
}
复杂度分析
堆排序的最坏时间复杂度为O(nlogn)。堆序的平均性能较接近于最坏性能。由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
堆排序是就地排序,辅助空间为O(1),
它是不稳定的排序方法。
相关文章推荐
- Java排序算法总结之(三)——选择排序(简单选择排序、堆排序)
- 排序算法总结之堆排序
- 对常见排序算法的总结(选择、插入、希尔、归并、快速、堆排序)
- 排序算法总结之堆排序
- 各种排序算法总结----基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序
- Java排序算法总结之堆排序
- 排序算法总结-插入排序、希尔排序、堆排序、快速排序
- 各排序算法总结(简单选择,冒泡,快速,希尔排序,堆排序)
- 排序算法总结之堆排序 Heap Sort
- 排序算法总结(5)--堆排序
- 16 - 12 - 17 十大排序算法总结(二) 之 桶排序,堆排序
- 排序算法总结之堆排序
- 常见排序算法总结与实现(冒泡、插入、选择、希尔、堆排序、归并、快排)
- 排序算法总结(简单选择排序、堆排序)(python实现)
- 排序算法总结(插入、Shell、选择、堆排序、冒泡、快速、归并、基数)
- 常见排序算法总结与实现(冒泡、插入、选择、希尔、堆排序、归并、快排)
- Java排序算法总结(六):堆排序
- 排序算法总结---树形选择排序,堆排序
- 排序算法总结-插入排序、希尔排序、堆排序、快速排序