首页 > 其他分享 >C语言基础(二十九)

C语言基础(二十九)

时间:2024-08-31 08:54:01浏览次数:13  
标签:arr int largest 基础 C语言 二十九 low printf include

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;  
}

运行结果如下:

 

 

 

标签:arr,int,largest,基础,C语言,二十九,low,printf,include
From: https://blog.csdn.net/wehpd/article/details/141740625

相关文章

  • 卡尔曼滤波算法(c语言代码)
    卡尔曼滤波器是一种用于估计动态系统状态的算法,常用于信号处理、控制系统、机器人和导航等领域。以下是一个简单的卡尔曼滤波器的C语言实现示例。这个示例展示了如何使用卡尔曼滤波器来估计一维系统的状态。1.卡尔曼滤波器算法概述卡尔曼滤波器由两部分组成:预测和更新。基......
  • Mysql基础练习题 596.查询至少有5个学生的所有班级 (力扣)
    596.查询至少有5个学生的所有班级建表插入数据:CreatetableIfNotExistsCourses(studentvarchar(255),classvarchar(255))TruncatetableCoursesinsertintoCourses(student,class)values('A','Math')insertintoCourses(student,class)values(......
  • 第3天---RSA基础题型(二)
    前言:量是一定要积累的,但是不要一味的追求量,导致学完后面的知识,忘了前面的知识,得不偿失,那我们当然要避免这种情况,那就先花点时间复习昨天的内容。................过了10minT9.添加小因子(e与phi不互素)一.题目:fromCrypto.Util.numberimport*flag=b'NSSCTF{******}'p......
  • Python基础 2 - 程序控制流语句
    文章目录一、程序控制流语句二、if判断语句1、单、双分支if条件格式2、多分支if条件格式:3、if判断语句的嵌套4、三元操作符三、循环语句1、while循环2、for循环延伸:列表推导式3、循环中断4、使用循环常见的错误和陷阱  大家好,我是技术界的小萌新,今......
  • Redis基础知识学习笔记(一)
    文章目录Redis简介Redis简介REmoteDIctionaryServer(Redis)是一个由SalvatoreSanfilippo写的key-value存储系统,是跨平台的非关系型数据库,其是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)......
  • Python基础 3 - 函数及数据容器
    文章目录一、函数概念1、函数介绍2、函数的定义3、函数的调用4、函数说明文档5、函数嵌套调用6、变量作用域1)局部变量2)全局变量3)声明全局变量二、数据容器入门1、列表(list)1)列表的定义2)调用列表元素3)列表的方法4)列表的特点5)列表的遍历(迭代)6)列表的乘......
  • C语言文件相关函数
    目录一、引言二、文件函数概述  1.文件类型指针  2.常用文件函数三、文件函数使用详解  1.打开文件  2.关闭文件  3.写入文件  4.读取文件  5.二进制文件操作四、实战应用五、总结        本文将详细介绍C语言中文件函数的基本概念......
  • 【C语言进阶】C语言指针进阶实战:优化与难题解析
    ......
  • C语言基础(二十六)
    二叉树节点通常包含三个部分:存储数据的部分、指向左子节点的指针、以及指向右子节点的指针。测试代码:#include"date.h"#include<stdio.h>#include<stdlib.h>#include<time.h>//定义二叉树节点的结构,包括节点的值、指向左子节点的指针和指向右子节点的指针。t......
  • C语言基础(二十七)
    1、位字段(Bit-fields)也是一种数据结构,允许在结构体(struct)或联合体(union)中定义其成员占用特定的位数。对于需要精确控制内存布局或处理硬件寄存器映射等场景非常有用。位字段使得开发者能够定义小于一个字节的变量,从而更有效地利用内存空间。位字段的声明方式是在结构体或联合体......