C语言基础(二十九)

news2024/11/16 5:57:51

1、快速排序:

#include "date.h"
#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
  
// 函数声明  
void quickSort(int *arr, int low, int high);  
void swap(int *xp, int *yp);  
void printArray(int *arr, int size);  
int  partition(int *arr, int low, int high);
  
int main() {
    int times = getTime();  
    int n, i;  
    printf("请输入数字n: ");  
    scanf("%d", &n);  
  
    // 动态分配数组  
    int *arr = (int *)malloc(n * sizeof(int));  
    if (arr == NULL) {  
        printf("内存分配失败!\n");  
        return 1;  
    }  
  
    // 初始化随机数生成器  
    srand(time(NULL));  
  
    // 生成随机数并存储到数组中  
    for (i = 0; i < n; i++) {  
        arr[i] = rand() % 100; // 生成0到99之间的随机数  
    }  
  
    // 打印原始数组  
    printf("原始数组: ");  
    printArray(arr, n);  
  
    // 对数组进行快速排序  
    quickSort(arr, 0, n - 1);  
  
    // 打印排序后的数组  
    printf("排序后的数组: ");  
    printArray(arr, n);  
  
    // 释放内存  
    free(arr);  
  
    return 0;  
}  
  
// 快速排序函数  
void quickSort(int *arr, int low, int high) {  
    if (low < high) {  
        // pi是分区索引,arr[pi]现在位于正确的位置  
        int pi = partition(arr, low, high);  
  
        // 分别对分区前后的子数组进行快速排序  
        quickSort(arr, low, pi - 1);  
        quickSort(arr, pi + 1, high);  
    }  
}  
  
// 分区函数  
int partition(int *arr, int low, int high) {  
    int pivot = arr[high];    // 选择最后一个元素作为基准  
    int i = (low - 1);        // 较小元素的索引  
  
    for (int j = low; j <= high - 1; j++) {  
        // 如果当前元素小于或等于基准  
        if (arr[j] <= pivot) {  
            i++;    // 增加较小元素的索引  
            swap(&arr[i], &arr[j]);  
        }  
    }  
    swap(&arr[i + 1], &arr[high]);  
    return (i + 1);  
}  
  
// 交换两个整数的值  
void swap(int *xp, int *yp) {  
    int temp = *xp;  
    *xp = *yp;  
    *yp = temp;  
}  
  
// 打印数组函数  
void printArray(int *arr, int size) {  
    for (int i = 0; i < size; i++) {  
        printf("%d ", arr[i]);  
    }  
    printf("\n");  
}

运行结果如下:

 

2、归并排序:

#include "date.h"
#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
  
// 归并排序的辅助函数  
void merge(int arr[], int l, int m, int r) {  
    int i, j, k;  
    int n1 = m - l + 1;  
    int n2 = r - m;  
  
    int L[n1], R[n2];  
  
    for (i = 0; i < n1; i++)  
        L[i] = arr[l + i];  
    for (j = 0; j < n2; j++)  
        R[j] = arr[m + 1 + j];  
  
    i = 0; // 初始索引第一个子数组  
    j = 0; // 初始索引第二个子数组  
    k = l; // 初始索引合并的子数组  
    while (i < n1 && j < n2) {  
        if (L[i] <= R[j]) {  
            arr[k] = L[i];  
            i++;  
        } else {  
            arr[k] = R[j];  
            j++;  
        }  
        k++;  
    }  
  
    while (i < n1) {  
        arr[k] = L[i];  
        i++;  
        k++;  
    }  
  
    while (j < n2) {  
        arr[k] = R[j];  
        j++;  
        k++;  
    }  
}  
  
// 归并排序函数  
void mergeSort(int arr[], int l, int r) {  
    if (l < r) {  
        int m = l + (r - l) / 2;  
        mergeSort(arr, l, m);  
        mergeSort(arr, m + 1, r);  
        merge(arr, l, m, r);  
    }  
}  
  
// 生成随机数并动态添加到数组中 
int* generateRandomArray(int n) {  
    int *arr = (int*)malloc(n * sizeof(int)); // 动态分配内存  
    if (!arr) {  
        fprintf(stderr, "Memory allocation failed\n");  
        exit(EXIT_FAILURE);  
    }  
  
    srand(time(NULL)); // 初始化随机数种子
    for (int i = 0; i < n; i++) {  
        arr[i] = rand() % 100; // 生成0到99之间的随机数  
    }  
  
    return arr;  
}  
  
// 主函数  
int main() {  
    int times = getTime();
    int n;  
    printf("Enter the number of elements: ");  
    scanf("%d", &n);  
  
    int *arr = generateRandomArray(n);  
  
    printf("Original array: \n");  
    for (int i = 0; i < n; i++)  
        printf("%d ", arr[i]);  
    printf("\n");  
  
    mergeSort(arr, 0, n - 1);  
  
    printf("Sorted array: \n");  
    for (int i = 0; i < n; i++)  
        printf("%d ", arr[i]);  
    printf("\n");  
  
    free(arr); // 释放动态分配的内存  
    return 0;  
}

运行结果如下:

 

3、堆排序:

#include "date.h"
#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
  
// 堆调整函数,用于构建最大堆  
void heapify(int arr[], int n, int i) {  
    int largest = i; // 初始化最大值为根  
    int left = 2 * i + 1; // 左子节点  
    int right = 2 * i + 2; // 右子节点  
  
    // 如果左子节点大于根  
    if (left < n && arr[left] > arr[largest])  
        largest = left;  
  
    // 如果右子节点大于当前最大  
    if (right < n && arr[right] > arr[largest])  
        largest = right;  
  
    // 如果最大值不是根  
    if (largest != i) {  
        int swap = arr[i];  
        arr[i] = arr[largest];  
        arr[largest] = swap;  
  
        // 递归地调整受影响的子树  
        heapify(arr, n, largest);  
    }  
}  
  
// 堆排序函数  
void heapSort(int arr[], int n) {  
    // 构建最大堆  
    for (int i = n / 2 - 1; i >= 0; i--)  
        heapify(arr, n, i);  
  
    // 一个个从堆顶取出元素  
    for (int i = n - 1; i > 0; i--) {  
        // 移动当前根到末尾  
        int temp = arr[0];  
        arr[0] = arr[i];  
        arr[i] = temp;  
  
        // 调用最大堆调整函数  
        heapify(arr, i, 0);  
    }  
}  
  
// 生成随机数并动态添加到数组中 
int* generateRandomArray(int n) {  
    int *arr = (int*)malloc(n * sizeof(int)); // 动态分配内存  
    if (!arr) {  
        fprintf(stderr, "Memory allocation failed\n");  
        exit(EXIT_FAILURE);  
    }  
  
    srand(time(NULL)); // 初始化随机数种子  
    for (int i = 0; i < n; i++) {  
        arr[i] = rand() % 100; // 生成0到99之间的随机数  
    }  
  
    return arr;  
}  
  
int main() { 
    int times = getTime(); 
    int n;  
    printf("Enter the number of elements: ");  
    scanf("%d", &n);  
  
    int *arr = generateRandomArray(n);  
  
    printf("Original array: \n");  
    for (int i = 0; i < n; i++)  
        printf("%d ", arr[i]);  
    printf("\n");  
  
    heapSort(arr, n);  
  
    printf("Sorted array: \n");  
    for (int i = 0; i < n; i++)  
        printf("%d ", arr[i]);  
    printf("\n");  
  
    free(arr); // 释放动态分配的内存  
    return 0;  
}

运行结果如下:

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2090921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSRF漏洞的预防

目录 CSRF漏洞预防措施 深入研究 CSRF Token的工作原理是什么&#xff1f; 为什么仅依靠Referer头字段来防范CSRF攻击不是完全可靠&#xff1f; SameSite cookie属性如何防止CSRF攻击&#xff1f; SameSite Cookie属性的作用 如何通过SameSite属性防止CSRF攻击 导图 CS…

JavaWeb JavaScript ⑧ DOM编程

在光芒万丈之前&#xff0c;我们都要欣然接受眼下的难堪和不易&#xff0c;接受一个人的孤独和无助&#xff0c;认真做好眼前的每一件事&#xff0c;你想要的都会有 —— 24.8.29 一、什么是DOM编程 简单来说&#xff1a;DOM(Document obiect Model)编程就是使用document对象的…

Python 如何进行密码学操作(cryptography模块)

Python 的密码学操作可以通过 cryptography 模块来实现&#xff0c;这个模块是一个功能强大的库&#xff0c;它提供了现代密码学的基本工具&#xff0c;包括加密、解密、密钥生成、签名等操作。cryptography 模块易于使用&#xff0c;并且安全性高&#xff0c;适合在各种场景下…

【软件测试】8. 测试分类

目录 1. 为什么要对软件测试进行分类&#xff1f; 2.按照测试目标分类 2.1 界面测试 2.2 功能测试 2.3 性能测试 2.4 可靠性测试 2.5 安全性测试 2.6 易用性测试 3.按照执行方式分类 3.1 静态测试 3.2 动态测试 4. 按照测试方法 4.1 白盒测试 4.2 黑盒测试 4.3灰…

【WiFi协议的发展学习1】

WiFi协议的发展 WiFi协议的发展2. WiFi协议发展3. WiFi协议发展小结3.1. 发展归纳3.2. 未来展望4. WiFi产品的特点/功能WiFi协议的发展 自20世纪90年代以来, WiFi技术得到了迅猛发展,已成为人们日常生活、工作和学习中不可或缺的组成部分。WiFi协议的发展不仅推动了无线通信…

TL-Tomcat 整体架构和处理请求流程解析

我们写一个servlet后&#xff0c;在web.xml里配上我们的路径。然后把项目打包成war包放入webapps目录下 然后这样就返回了 这个war包里面的东西和这个文件夹其实是一样的&#xff1a; 那么最终我们把war包删掉 还有原来文件夹下其他的东西 只剩下这么个.class文件 其实这…

TikTok流量推送逻辑与IP的关系

在探讨TikTok流量推送逻辑时&#xff0c;很多用户都好奇这一机制是否与用户的IP地址紧密相关。TikTok作为全球知名的短视频社交平台&#xff0c;其流量推送算法无疑是平台成功的关键因素之一。那么&#xff0c;TikTok的流量推送逻辑究竟是如何运作的&#xff1f;它与IP地址之间…

C语言 | Leetcode C语言题解之第385题迷你语法分析器

题目&#xff1a; 题解&#xff1a; struct NestedInteger* helper(const char * s, int * index){if (s[*index] [) {(*index);struct NestedInteger * ni NestedIntegerInit();while (s[*index] ! ]) {NestedIntegerAdd(ni, helper(s, index));if (s[*index] ,) {(*index…

使用InternLM实现谁是卧底游戏

环境 # 创建虚拟环境 conda create -n spy python3.10 -y conda activate spy pip install streamlit1.37.0 openai1.37.1 git clone https://github.com/sci-m-wang/Spy-Game.git cd Spy-Game 修改脚本who_is_the_spy.py中的client 部分 if "client" not in …

pdf转cad软件,5款快速上手转换软件分享

在当今快节奏的工作环境中&#xff0c;图纸文件的格式转换成为设计师、工程师等职业群体日常工作中不可或缺的一环。尤其是将PDF文件转换为CAD格式&#xff0c;不仅能够提升工作效率&#xff0c;还能确保设计数据的准确性和可编辑性。下面给大家分享5款能够快速上手转换软件&am…

快蜗牛OZON数据分析工具,快蜗牛OZON选品工具

现在电商行业蓬勃发展的时代&#xff0c;OZON是俄罗斯及东欧边相当重要的电商平台&#xff0c;它背后的数据里藏着超多商业机会。快蜗牛数据专门针对 OZON 平台搞数据分析的&#xff0c;能帮咱们卖家看透市场&#xff0c;还能指导商家怎么做生意。接下来看快蜗牛对 OZON 的数据…

物理机安装Centos后无法连接网络(网线网络)怎么办?-呕心沥血总结版-超简单

问题情境 高高兴兴的在物理机上装了个centos7,打开一看,哇,网卡没有我的局域网IP,怎么办,已经插上网线了呀,灯也在闪烁,怎么没有网络呀? 其实,是缺少网卡驱动! 问题解决: 1.查询网卡版本 在服务器上输入命令: lspci | grep Ethernet可以看到,我的网卡是RTL8…

Python Excel 操作全面总结

Excel 是我们日常生活中经常使用的数据处理工具&#xff0c;而 Python 作为一种强大的编程语言&#xff0c;在处理 Excel 文件方面也有着广泛的应用。本文将全面总结 Python Excel 操作&#xff0c;包括如何使用 Python 来读取、写入、修改 Excel 文件&#xff0c;以及如何使用…

2024全国大学生数学建模国赛,成员如何分工协作?

文末获取2024国赛数学建模思路代码&#xff0c;9.5开赛后第一时间更新 大家知道&#xff0c;数学建模竞赛是需要一个团队的三个人在三天或四天的时间内&#xff0c;完成模型建立&#xff0c;编程实现和论文写作的任务&#xff0c;对许多第一次参加建模或者建模经验比较欠缺的团…

电饭煲语音应用方案:工业级性能、简单易用,NRK3301语音识别ic

随着人们对电器的需求不断增大&#xff0c;家用电饭煲经过不断地改革和创新&#xff0c;拥有了更多使用的功能&#xff0c;以往电饭煲只用于煮米饭。如今&#xff0c;还增加了煲汤、煮粥、无水焗、收汁入味等十多种功能。 除此之外&#xff0c;如今的电饭煲越来越人性化&#x…

AI周报(8.25-8.30)

AI应用-Beyond Math 的“数字风洞”应用于 F1 赛车 Beyond Math 的首批市场之一是一级方程式赛车&#xff0c;一些车队正在探索使用该软件来加快他们的空气动力学和车辆设计过程。 BeyondMath 的联合创始人达伦加维&#xff08;Darren Garvey&#xff09;告诉TechCrunch&#…

【MySQL-24】万字全面解析<索引>——【介绍&语法&性能分析&使用规则】

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

一文打通前端环境搭建

目录 nvm管理安装nvm 管理node配置nvm环境变量切换nvm国内镜像 安装nodenpm 镜像切换打包工具yarn安装yarnyarn切换淘宝镜像 安装vue脚手架开发工具vscode安装(傻瓜式安装) 启动项目vue插件配置 关于yarmyarm常用命令 nvm管理 安装nvm 管理node 访问github地址&#xff1a;ht…

Electron 项目实战 02:打包和自动更新

技术选型 electron-forgeelectron-builder electron-forge 是Electron 官方文档介绍的&#xff0c;打包和发布都包含了&#xff0c;但是包含的坑也非常多。electron-builder下载量和集成打包非常顺利&#xff0c;本教程也是采用electron-buid来介绍打包。大家在技术选型的时候…

火绒补充| 截止目前修改时间| 本文已上全站总榜33

目录 为什补充&#xff1f; 用户界面优化&#xff1a; 性能提升&#xff1a; 启发式检测和行为分析&#xff1a; 恶意网址拦截&#xff1a; 系统修复功能&#xff1a; 网络安全防护&#xff1a; 云查杀引擎&#xff1a; 漏洞修复和补丁管理&#xff1a; 隐私保护&…