C语言基础(二十九)

2024-08-31 13:20
文章标签 语言 基础 二十九

本文主要是介绍C语言基础(二十九),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

运行结果如下:

 

 

 

这篇关于C语言基础(二十九)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124022

相关文章

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

如何合理管控Java语言的异常

《如何合理管控Java语言的异常》:本文主要介绍如何合理管控Java语言的异常问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍2、Thorwable类3、Error4、Exception类4.1、检查异常4.2、运行时异常5、处理方式5.1. 捕获异常

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

C语言中的常见进制转换详解(从二进制到十六进制)

《C语言中的常见进制转换详解(从二进制到十六进制)》进制转换是计算机编程中的一个常见任务,特别是在处理低级别的数据操作时,C语言作为一门底层编程语言,在进制转换方面提供了灵活的操作方式,今天,我们将深... 目录1、进制基础2、C语言中的进制转换2.1 从十进制转换为其他进制十进制转二进制十进制转八进制十进

$在R语言中的作用示例小结

《$在R语言中的作用示例小结》在R语言中,$是一个非常重要的操作符,主要用于访问对象的成员或组件,它的用途非常广泛,不仅限于数据框(dataframe),还可以用于列表(list)、环境(enviro... 目录1. 访问数据框(data frame)中的列2. 访问列表(list)中的元素3. 访问jav

MySQL复合查询从基础到多表关联与高级技巧全解析

《MySQL复合查询从基础到多表关联与高级技巧全解析》本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句,感兴趣的朋友跟随小编一起看看吧... 目录前言:1.基本查询回顾:1.1.查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J1.2.按照部门

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服