首页 > 其他分享 >2023年11月第一周学习总结

2023年11月第一周学习总结

时间:2023-11-01 23:23:15浏览次数:35  
标签:11 第一周 int ++ low 2023 include bigger heapSize

排序

归并排序

本质是将多个序列进行合并,和快排一样也用的是分而治之的思想,并且它也是基于比较里面较快的算法且能保持稳定性的算法。

那么怎么将两个序列合并呢?(假设左右两边已经有序)

  1. 开辟一个和数组一样大的辅助数组,再设定两个指针,第一个指针指向第一个序列的开头,第二个指针指向第二个序列的开头。
  2. 升序的话,就判断第一个指针所指的值如果小于等于第二个指针所指的值,就把第一个指针所指的值赋值到辅助数组。
  3. 如果第一个指针的所指的值大于第二个指针所指的值,就把第二个指针所指的值赋值到辅助数组
  4. 重复第二步和第三步直到左右两边有一边没有数了
  5. 把剩下的数复制到辅助数组

 

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#define N 3//设置数组的大小

void mergeSort(int *a, int low, int high);//归并排序
void merge(int *a, int low, int mid, int high);//合并两个序列

int main(int argc, char *argv[])
{
int a[N];

for ( int i = 0; i < N; i++) {
scanf("%d", a + i);
}

mergeSort(a, 0, N - 1);

for ( int i = 0; i < N; i++) {
printf("%5d", a[i]);
}

putchar('\n');

return 0;
}
void mergeSort(int *a, int low, int high)
{
int mid = low + (high - low) >> 1;

if ( low == high) {
return ;
}

mergeSort(a, low, mid);
mergeSort(a, mid + 1, high);
merge(a, low, mid, high);
}
void merge(int *a, int low, int mid, int high)
{
int *p1 = (int*)malloc(sizeof(int) * (high - low + 1));
int p = low;
int q = mid + 1;
int i = 0;

while(p <= mid && q <= high) {
if ( a[p] <= a[q]) {
p1[i++] = a[p++];
}
else {
p1[i++] = a[q++];
}
}

while( p <= mid) {
p1[i++] = a[p++];
}

while( q <= high) {
p1[i++] = a[q++];
}

for (int j = 0; j < i; j++) {
a[low + j] = p1[j];
}
}

 堆排序

堆就是一颗完全二叉树结构,完全二叉树就是按从上到下,从左到右顺序的一颗树。堆分为大根堆和小根堆。大跟堆就是每一个子树它的父节点是最大的节点,小根堆就是每一个子树它的父节点是最小的节点.那么怎么建立二叉树到数组的映射呢。

对于任何一个下标i,它的父节点是( i - 1) / 2,左孩子是 (i * 2) + 1,右孩子是(i * 2) + 2.通过公式我们可以在数组中表示一颗完全二叉树。

这就是一颗完全二叉树也是满二叉树,观察它们的下标我们发现是符合刚刚的公式的。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#define N 10
void heapSort(int *a, int size);

int main(int argc,char *argv[])
{
    int a[N];
    
    srand(time(NULL));
    
    for (int i = 0; i < N; i++) {
        a[i] = rand() % 100;
    }
    
    printf("原数组\n");
    for (int i = 0; i < N; i++) {
        printf("%d ", a[i]);
    }
    putchar('\n');
    
    heapSort(a, N);
    
    for (int i = 0; i < N; i++) {
        printf("%d ", a[i]);
    }
    
    return 0; 
}
void heapSort(int *a, int size)
{
    if (size == 1) {
        return;
    }
    
    int heapSize = 0;
    
    a[heapSize++] = a[0];
    
    for (int i = 1; i < N; i++) {
        int j = i;
        a[heapSize++] = a[j];
        while( a[j] > a[(j - 1) / 2] && j) {
            int t = a[j];
            a[j] = a[(j - 1) / 2];
            a[(j - 1) / 2] = t;
            j = (j - 1) / 2;
        }
    }
    
    while( heapSize != 1) {
        int t = a[0];
        int j = 0;
        int bigger = 0;
        
        a[0] = a[heapSize - 1];
        a[heapSize - 1] = t;
        heapSize--;
        
        if (heapSize == 1) {
            break;
        }
        
        if ( 2 < heapSize ) {
            bigger = a[1] > a[2]? 1: 2;
        }
        else {
            bigger = 1;
        }
        
        while( j < heapSize && a[j] < a[bigger]) {
            t = a[j];
            a[j] = a[bigger];
            a[bigger] = t;
            j = bigger;
            
            if ( (j * 2 + 1) < heapSize)  {
                if ( j * 2 + 2 < heapSize) {
                    bigger = a[j * 2 + 1] > a[j * 2 + 2]? (j * 2 + 1): (j * 2 + 2);
                }
                else {
                    bigger = j * 2 + 1;
                }
            }
            else {
                break;
            }
        }
    }
}

这是自己写的代码没有进行优化有点丑

 

BFS

 

DFS

 

标签:11,第一周,int,++,low,2023,include,bigger,heapSize
From: https://www.cnblogs.com/lwj1239/p/17804313.html

相关文章

  • 每日总结20231101
    代码时间(包括上课)6h代码量(行):100行博客数量(篇):1篇相关事项:1、今天是周三,上的是软件构造,软件构造讲的是对于csv文件的读写操作。2、今天下午开会然后上班,把erp的作业也完成了,需要加速看软考了。3、今天还打算看看软件设计师相关的题目,我要过!......
  • 2023-2024-1 20231402《计算机基础与程序设计》第六周学习总结
    2023-2024-120231402《计算机基础与程序设计》第六周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第6周作业这个作业的目标自学计算机科学概论第7章《C语言程序设计》第5章作业......
  • DiscuzQ官方最新v3.0.220211源码编译搭建教程和官方部署教程,适合二开(已本地编译通过,无
    经过长达半个月的研究!完成这篇DiscuzQ官方最新版本v3.0.220211的源码编译和官方部署教程。适合喜欢二次开发的小伙伴们,已经通过本地编译测试,保证没有任何错误。具体教程在我搭建的dzq(使用二开方法搭建)发布的文章:https://www.abyssdawn.com/thread/4......
  • 2023NOIP A层联测22 差后队列
    2023NOIPA层联测22差后队列挺有意思的期望题,题解做法应该是DP,但是我又双叒写出奇怪的做法……思路除去最大值外的元素个数的倒数就是这一轮取到某个数的概率,而最大值是特殊的情况,在被替代之前或作为最后一个数被弹出之前,不参与计算。对于操作0的输出和操作1的输出分开......
  • [20231027]Index ITL Limit 3.txt
    [20231027]IndexITLLimit3.txt--//链接https://jonathanlewis.wordpress.com/2022/02/18/index-itl-limit/,使用自治事务。--//自己尝试不使用自治事务写一个看看。1.环境:SCOTT@book>@ver1PORT_STRING        VERSION   BANNER------------------------------......
  • 2023.11.1——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.mybatis明日计划:学习......
  • [20231031]Index ITL Limit 4.txt
    [20231031]IndexITLLimit4.txt--//昨天做了IndexITLLimi的测试,参考链接=>[20231027]IndexITLLimit3.txt.--//我想看看这个边界大概在那里,测试看看.1.环境:SCOTT@book>@ver1PORT_STRING        VERSION   BANNER---------------------------------------......
  • 2023就业困难,Android程序员对应的策略有哪些?
    前言亲爱的朋友们,今年的就业情况大家有目共睹,大厂不断裁员,高校毕业生1158万,达历史新高那么今天就让我们一起深入探讨今年的就业形势为何如此困难。如何在这个充满挑战的时刻,更好地理解这个问题,并发现其中隐藏的成长机会。疫情的冲击首先,我们不得不提到疫情对就业市场的巨大冲击。全......
  • [20231023]为什么刷新缓存后输出记录顺序发生变化6.txt
    [20231023]为什么刷新缓存后输出记录顺序发生变化6.txt--//前几天做了单表刷新缓存后输出记录顺序发生变化的情况,测试2个表的情况时遇到一个奇怪的现象。--//我前面的测试18c,如果使用10046跟踪看不到我遇到的情况,我想使用strace跟踪,发现该机器配置使用asm,strace跟踪无法看到一--/......
  • [20231026]enq TX - allocate ITL entry的测试4.txt
    [20231026]enqTX-allocateITLentry的测试4.txt--//以前做过测试,自己竟然有点看不明白,再次验证看看。1.环境:SCOTT@book>@ver1PORT_STRING                   VERSION       BANNER---------------------------------------------------------......