王道C语言督学营OJ课后习题(课时17)

cpp 复制代码
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
typedef int ElemType;
typedef struct {
    ElemType *elem;
    int TableLen;
}SSTable;
void Init_ST(SSTable &ST,int len)//申请空间,并进行随机数生成
{
    ST.TableLen=len;
    ST.elem=(ElemType*) malloc(sizeof (ElemType)*ST.TableLen);
    srand(time(NULL));
    for (int i = 0; i < ST.TableLen; ++i) {
        ST.elem[i]=rand()%100;
    }
}
void Print_ST(SSTable ST)
{
    for (int i = 0; i < ST.TableLen; ++i) {
        printf("%3d",ST.elem[i]);
    }
    printf("\n");
}
void swap(ElemType &a,ElemType &b)
{
    ElemType temp;
    temp=a;
    a=b;
    b=temp;
}
void SelectSort(ElemType *A,int n)
{
    int i,j,min;//min是用来记录每一趟最小元素的下标
    for(i=0;i<n-1;i++)
    {
        min=i;
        for(j=i+1;j<n;j++)
        {
            if(A[j]<A[min])
                min=j;
        }
        if(i!=min)
        {
            swap(A[i],A[min]);
        }
    }
}
void AdjustDown(ElemType A[],int k,int len)
{
    int dad=k;
    int son=2*dad+1;//左孩子下标
    while (son<=len)
    {
        if(son+1<=len && A[son]<A[son+1])//看下有没有右孩子,比较左右孩子选大的
        {
            son++;
        }
        if(A[son]>A[dad])//比较孩子和父亲,如果孩子大于父亲,那么进行交换
        {
            swap(A[son],A[dad]);
            dad=son;//孩子重新作为父亲,判断下一颗子树是否符合大根堆
            son=2*dad+1;
        } else
        {
            break;
        }
    }
}
void HeapSort(ElemType A[],int len)
{
    int i;
    //建立大根堆
    for(i=len/2;i>=0;i--)
    {
        AdjustDown(A,i,len);
    }
    swap(A[0],A[len]);//交换顶部和数组最后一个元素
    //下面的策略就是,不但调整剩余元素为大根堆,因为根部最大,所以再次与A[i]交换(相当于放到数组后面),循环往复
    for(i=len-1;i>0;i--)
    {
        AdjustDown(A,0,i);//剩下元素调整为大根堆
        swap(A[0],A[i]);
    }
}
int main() {
    SSTable  ST;
    ST.TableLen=10;
    ST.elem=(ElemType*) malloc(sizeof (ElemType)*ST.TableLen);
    for (int i = 0; i < ST.TableLen; ++i) {
        scanf("%d",&ST.elem[i]);
    }
    SelectSort(ST.elem,10);
    Print_ST(ST);
    HeapSort(ST.elem,10);
    Print_ST(ST);
    return 0;
}
cpp 复制代码
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define N 10
typedef int ElemType;
void Merge(ElemType A[],int low,int mid,int high)
{
    static ElemType B[N];//加static的目的是无论多次递归,都只有一个B[N]
    int i,j,k;
    for(k=low;k<=high;k++)//复制元素到B中
        B[k]=A[k];
    //合并数组
    for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++)
    {
        if(B[i]<=B[j])
            A[k]=B[i++];
        else
            A[k]=B[j++];
    }
    while (i<=mid)//如果有剩余元素,接着放入即可
        A[k++]=B[i++];//前一半有剩余的放入
    while (j<=high)//如果有剩余元素,接着放入即可
        A[k++]=B[j++];//后一半有剩余的放入
}
void MergeSort(ElemType A[],int low,int high)//递归分割
{
    if(low<high)
    {
        int mid=(low+high)/2;
        MergeSort(A,low,mid);//排序好前一半
        MergeSort(A,mid+1,high);//排序好后一半
        Merge(A,low,mid,high);//将连个排序好的数组合并
    }

}
void print(int *a)
{
    for (int i = 0; i < N; ++i) {
        printf("%3d",a[i]);
    }
    printf("\n");
}
int main() {
    int A[10]={12,63,58,95,41,35,65,0,38,44};
    MergeSort(A,0,9);
    print(A);
    return 0;
}
相关推荐
微风中的麦穗9 分钟前
【MATLAB】MATLAB R2025a 详细下载安装图文指南:下一代科学计算与工程仿真平台
开发语言·matlab·开发工具·工程仿真·matlab r2025a·matlab r2025·科学计算与工程仿真
2601_9491465317 分钟前
C语言语音通知API示例代码:基于标准C的语音接口开发与底层调用实践
c语言·开发语言
开源技术28 分钟前
Python Pillow 优化,打开和保存速度最快提高14倍
开发语言·python·pillow
学嵌入式的小杨同学34 分钟前
从零打造 Linux 终端 MP3 播放器!用 C 语言实现音乐自由
linux·c语言·开发语言·前端·vscode·ci/cd·vim
wfeqhfxz25887821 小时前
YOLO13-C3k2-GhostDynamicConv烟雾检测算法实现与优化
人工智能·算法·计算机视觉
Aaron15881 小时前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
mftang2 小时前
Python 字符串拼接成字节详解
开发语言·python
爱编码的小八嘎2 小时前
C语言对话-21.模板特化,缺省参数和其他一些有趣的事情
c语言
jasligea2 小时前
构建个人智能助手
开发语言·python·自然语言处理
kokunka2 小时前
【源码+注释】纯C++小游戏开发之射击小球游戏
开发语言·c++·游戏