首页 > 其他分享 >选择排序+堆排序(实现)

选择排序+堆排序(实现)

时间:2023-02-02 12:44:41浏览次数:42  
标签:41 int ElemType 堆排序 len ST 选择 排序 58

王道督学营17.1

/*
Description
读取10个整型数据12 63 58 95 41 35 65  0 38 44,然后通过选择排序,堆排序,分别对该组数据进行排序,输出2次有序结果,每个数的输出占3个空格
完成OJ作业的同学,可以购买《跟龙哥学C语言编程》,有很多课后习题可以练习,附带答案,或者直接B站搜王道论坛,看王道的数据结构,组成原理。
Input
12 63 58 95 41 35 65  0 38 44
Output
输出2次有序结果
0 12 35 38 41 44 58 63 65 95
0 12 35 38 41 44 58 63 65 95
Sample Input 1
12 63 58 95 41 35 65  0 38 44
Sample Output 1
  0 12 35 38 41 44 58 63 65 95
  0 12 35 38 41 44 58 63 65 95
 */
#include "stdlib.h"
#include "stdio.h"
#include "time.h"
typedef int ElemType;
typedef struct{
    ElemType *elem;
    int len;
}SSTable;
//交换两数据的值
void swap(ElemType &a,ElemType &b)
{
    ElemType temp=a;
    a=b;
    b=temp;
}
//表初始化,随机元素
void ST_Init(SSTable &T,int len)
{
    srand(time(NULL));
    T.elem=(ElemType*) malloc(len*sizeof (ElemType));
    T.len=len;
    for(int i=0;i<T.len;i++)
    {
        T.elem[i]=rand()%100;
    }
}
//表初始化,读取元素
void ST_Scanf(SSTable T,int len)
{
    for(int i=0;i<T.len;i++)
    {//读取10个值
        scanf("%d",&T.elem[i]);
    }
}
//输出表元素
void ST_Print(SSTable T)
{
    for(int i=0;i<T.len;i++)
    {
        printf("%3d",T.elem[i]);
    }
    printf("\n");
}
//选择排序,len为表长
void SelectSort(ElemType *A,int len)
{
    for(int i=0;i<len;i++)//i为左端
    {
        int min=i;//假设第一个(下标)为最小值
        for(int j=len-1;j>i;j--)//j从右到左
        {
            if(A[j]<A[min])
                min=j;
        }
        swap(A[i],A[min]);
    }
}
//从小到大排序:大根堆。从大到小排序:小根堆
//要求两个子树均为大根堆(空结点/叶子结点,也行),考虑根结点的插入,将根结点对应的树调整为大根堆
//下标从0开始,k为要调整的结点下标,ne为最后一个元素的下标
void AdjustDown1(ElemType *A,int k,int ne)
{
    int dad=k;
    int son=dad*2+1;//左孩子
    while(son<=ne)//左孩子和父亲都要存在
    {
        if(son+1<=ne&&A[son]<A[son+1])//右孩子存在&&右孩子大于左孩子
        {
            son++;
        }
        if(A[son]>A[dad])//孩子比爸爸大
        {//发生交换,影响下面的子树,故将孩子作为根节点继续调整。
            swap(A[son],A[dad]);
            dad=son;
            son=dad*2+1;
        }
        else//孩子比爸爸小,不交换,所以也不影响下面的子树
            break;
    }

}
//堆排序,ne为最后一个元素的下标
void HeapSort(ElemType* A,int ne)
{//堆在我心中,层次
    //1 将整个树变为大根堆
    for(int i=ne/2;i>=0;i--)
    {
        AdjustDown1(A,i,ne);
    }
    //2 将根结点与最后一个结点交换
    swap(A[0],A[ne]);
    //3 将最后一个元素排除,对缩小后的堆执行相同操作
    for(int i=ne-1;i>0;i--)
    {
        AdjustDown1(A,0,i);
        swap(A[0],A[i]);
    }
}
void Sort4()
{//选择排序
    SSTable T;
    ST_Init(T,10);
//    ST_Scanf(T,T.len);
    SelectSort(T.elem,T.len);
    ST_Print(T);
}
void Sort5()
{//堆排序
    SSTable T;
    ST_Init(T,10);
//    ST_Scanf(T,T.len);
    HeapSort(T.elem,T.len-1);
    ST_Print(T);
}
void test()
{
    SSTable T1,T2;
    ST_Init(T1,10);
    ST_Init(T2,10);
    for(int i=0;i<T1.len;i++)
    {//读取10个值
        ElemType temp;
        scanf("%d",&temp);
        T1.elem[i]=temp;
        T2.elem[i]=temp;
    }
    SelectSort(T1.elem,T1.len);
    ST_Print(T1);
    HeapSort(T2.elem,T2.len-1);
    ST_Print(T2);
}
int main() {
//    Sort4();
//    Sort5();
    test();
    return 0;
}

 

标签:41,int,ElemType,堆排序,len,ST,选择,排序,58
From: https://www.cnblogs.com/FishSmallWorld/p/17085641.html

相关文章

  • 归并排序(实现)
    王道督学营17.2/*Description读取10个整型数据1263589541356503844,然后通过归并排序,对该组数据进行排序,输出有序结果,每个数的输出占3个空格Input1263589......
  • python基础:sort和sorted排序
    记录下python中使用sort和sorted排序的方法 1、sortsort只能针对列表(list)进行排序,并且是对原列表进行排序,改变原列表内容>>>a=[5,6,1,2,0,8]>>>a.sort()>>>a......
  • 一篇文章带你了解KendoReact DateRangePicker,让日期选择变得更酷炫!
    KendoUI致力于新的开发,来满足不断变化的需求。现在我们非常自豪地宣布,通过React框架的KendoUIJavaScript封装来支持ReactJavascript框架。KendoReact能够为客户提供更......
  • 言简意赅的 Kahn 和 DFS 拓扑排序 (C++实现)
    I邻接表(AdjacentList)实现有向图在类内定义结构体Vertex(顶点).Vertex包含三个成员:data表示某顶点内所存放的内容,类型由模板决定(默认char)indegree表......
  • 冒泡排序+快速排序+插入排序(实现)
    王道督学营16/*Description读取10个整型数据1263589541356503844,然后通过冒泡排序,快速排序,插入排序,分别对该组数据进行排序,输出3次有序结果,每个数的输出占3个......
  • P1177 【模板】快速排序
    这次没有题目水字数了,记录一个很棒的快速排序模板!!voidQsort(intbeg,intend){ intmid=str[(beg+end)/2]; inti=beg,j=end; do{ while(str[i]<m......
  • 排序算法
    排序算法排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。......
  • NOI2022冒泡排序
    首先考虑A性质的点。区间最小值为\(1\)的限制等价于要求区间所有值为\(1\)。另外一种限制等价于区间不全为\(1\)。把一定是\(1\)的做一个区间覆盖。其他部分暂且......
  • 堆排序(Heap Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......
  • 计数排序(Counting Sort)
    一、算法概述1.1算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排......