先将无序的一个数组转换成一颗二分树的形状
二分树满足:
每个节点的数字都会大于两个节点的数字
节点对应的数字与子节点的数字有以下对应关系
i,2i,2i+1.
因此我们进行该类排序的时候有以下几步:
①生成一个随机数组
②转换成满足要求的二分树
③将最高处的数字和最后一个数字进行交换,再次转换成满足要求的二分树

C语言实现
①生成序列
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int * build_heap()
{
srand((unsigned)time(NULL));
int *p = (int *)malloc(sizeof(int) * 100);
for(int i = 0; i < 100; i++)
{
p[i] = rand() % 100 ;
}
return p;
}
②转换成二分树
void swap(int *p1, int*p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void keep(int arr[], int len)
{
int first = len / 2;
for(int i = first; i >= 0; i--)//从底到上
{
if(i * 2 + 1 > len)
{
if(arr[i] < arr[i * 2])
swap(&arr[i],&arr[2 * i]);
}
else
{
if(arr[i] <arr[2 * i] || arr[i] < arr[2 * i +1])
{
if(arr[2 * i] < arr[2 * i + 1])
{
swap(&arr[i] , &arr[2 * i + 1]);
}
else
{
swap(&arr[i] , &arr[2 * i]);
}
}
}
}
}
③排序
void sort(int arr[], int len)
{
for(int i = len; i > 0; i--) // 最后一个还用换?不必了
{
swap(&arr[0] , &arr[i]);
keep(arr, i-1);
}
}
int main()
{
int *p1 = build_heap();
//int len = sizeof(array)/sizeof(array[0]);
//sort(array,len);
sort(p1,100);
for(int i = 0; i < 100; i++)
{printf("%d,",p1[i]);}
return 0;
}
Python实现
L = [69,56,94,37,66,75,73,12,16,68,10,78,44,48,93,9,
70,32,90,52,97,11,69,74,67,24,75,59,61,92,80,74,42,91,66,20,
44,82,28,92,76,1,60,67,76,30,2,34,50,26,43,30,30,38,57,23,14,
17,15,44,14,92,95,66,67,14,50,70,4,41,15,8,86,44,76,90,95,90,
57,58,98,27,91,79,69,74,24,61,29,95,36,74,29,70,31,87,76,87,
72,56]
def swap(L,a,b):
c = L[a]
L[a] = L[b]
L[b] = c
return L
def keep(L,leng):
first = leng // 2
for i in range(first,-1,-1):
if(2 * i + 1 > leng):
if(L[i] < L[2 * i]):
L = swap(L,i, 2 * i)
else:
if(L[i] < L[2 * i] or L[i] < L[2 * i + 1]):
if(L[2 * i] < L[2 * i + 1]):
L = swap(L,i, 2 * i + 1)
else:
L = swap(L,i, 2 * i)
return L
def sort(L,leng):
L = swap(L,0, leng)
for i in range(leng,0,-1):
L = keep(L,i)
L = swap(L,0, i)
print(L)
sort(L,len(L)-1)
这篇博客介绍了如何使用C语言和Python实现从无序数组构建二分树并进行排序的过程。首先,通过生成随机数组开始,然后转换为满足二分树条件的结构。接下来,通过不断地调整节点位置,确保树的每个节点都大于其子节点。最后,通过交换最高节点与最后一个节点并重新调整,完成排序。示例代码详细展示了这一过程。

2686

被折叠的 条评论
为什么被折叠?



