#include<stdio.h>
#include<string.h>
int main()
{
int nums1[10] = { 0,8,6,3,9,7,5,4,2,1 };//nums1[0]为哨兵
int i, j;
printf(">>简单选择排序: ");
int max, temp;
for (i = 1; i <= 8; i++)//nums1[1]~nums1[9]
{
max = i;
for (j = i + 1; j <= 9; j++) {
if (nums1[max] < nums1[j]) {
max = j;
}
}
if (i != max) {
temp = nums1[max];
nums1[max] = nums1[i];
nums1[i] = temp;
}
}
for (i = 1; i <= 9; i++) {
printf("%d ", nums1[i]);
}
int nums2[10] = { 0,8,6,3,9,7,5,4,2,1 };//nums2[0]为哨兵
printf("\n>>堆排序:");
void HeapAdjust(int* nums2, int a, int b);
void Swap(int* nums2, int a, int b);
int Length = 9;
//先构成大顶堆(每个父结点比子结点大)
for (i = Length / 2; i >= 1; i--) {//遍历所有有孩子的父结点
HeapAdjust(nums2, i, Length );
}
//排序
for (i = Length; i > 1; i--) {
Swap(nums2, i, 1);
HeapAdjust(nums2, 1, i - 1);
}
for (i = 1; i <= 9; i++) {
printf("%d ", nums1[i]);
}
}
void Swap(int* nums2, int a, int b)
{
int temp;
temp = nums2[a];
nums2[a] = nums2[b];
nums2[b] = temp;
}
void HeapAdjust(int* nums2, int a, int b)
{
int j;//j为父结点的两个子结点
int temp = nums2[a];
for (j = a * 2; j <= b; j *= 2) {
if (j < b && nums2[j] < nums2[j + 1])
j = j + 1;//选出左右孩子中最大的孩子
if (nums2[j] <= temp)
break;//如果父结点比最大子结点大,则不必交换
nums2[a] = nums2[j];//反之,交换
a = j;//a变成下一个父结点
}
nums2[a] = temp;
}
简单选择排序和堆排序
最新推荐文章于 2025-12-04 16:31:04 发布
本文展示了如何使用C语言实现简单选择排序和堆排序算法。首先,详细解释了简单选择排序的过程,然后通过代码实现了一个升序排列的数组。接着,介绍了堆排序的原理,包括构建大顶堆和排序过程,并提供了相应的代码实现。这些排序算法对于理解数据结构和算法具有基础性意义。
981

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



