当前位置: 首页 > news >正文

c语言编程题经典100例——(36~40例)

1,实现快速排序算法。

下面是用C语言实现快速排序算法的示例代码:

#include <stdio.h>  void swap(int* a, int* b) {  int t = *a;  *a = *b;  *b = t;  
}  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 quickSort(int arr[], int low, int high) {  if (low < high) {  int pi = partition(arr, low, high);  quickSort(arr, low, pi - 1);  quickSort(arr, pi + 1, high);  }  
}  int main() {  int arr[] = {10, 7, 8, 9, 1, 5};  int n = sizeof(arr) / sizeof(arr[0]);  quickSort(arr, 0, n - 1);  printf("Sorted array: ");  for (int i = 0; i < n; i++) {  printf("%d ", arr[i]);  }  return 0;  
}

        快速排序算法的基本思想是,选择一个基准元素,将数组划分为两个子数组,左边的元素小于基准元素,右边的元素大于基准元素,然后递归地对左右两个子数组进行排序。在实现中,partition函数用来划分数组,并返回基准元素的最终位置。quickSort函数用来递归地排序左右两个子数组。

2,实现归并排序算法。

以下是C语言实现归并排序算法的示例代码:

#include <stdio.h>  void merge(int arr[], int left[], int right[], int left_size, int right_size) {  int i, j, k;  i = j = k = 0;  while (i < left_size && j < right_size) {  if (left[i] <= right[j]) {  arr[k++] = left[i++];  } else {  arr[k++] = right[j++];  }  }  while (i < left_size) {  arr[k++] = left[i++];  }  while (j < right_size) {  arr[k++] = right[j++];  }  
}  void mergeSort(int arr[], int n) {  if (n < 2) {  return;  }  int mid = n / 2;  int left[mid], right[n - mid];  for (int i = 0; i < mid; i++) {  left[i] = arr[i];  }  for (int i = mid; i < n; i++) {  right[i - mid] = arr[i];  }  mergeSort(left, mid);  mergeSort(right, n - mid);  merge(arr, left, right, mid, n - mid);  
}  int main() {  int arr[] = {10, 7, 8, 9, 1, 5};  int n = sizeof(arr) / sizeof(arr[0]);  mergeSort(arr, n);  printf("Sorted array: ");  for (int i = 0; i < n; i++) {  printf("%d ", arr[i]);  }  return 0;  
}

在这个示例代码中,merge函数将两个有序数组(left和right)合并为一个有序数组(arr)。mergeSort函数将整个数组分成两个子数组,递归地对它们进行排序,然后将它们合并。在主函数中,我们首先声明一个整数数组,然后计算它的大小,最后调用mergeSort函数对其进行排序。

3,实现链表中的两个节点之间的距离。

在链表中,两个节点之间的距离可以通过遍历链表并计算节点之间的差距来计算。以下是一种C语言实现的方式。

首先,我们需要定义链表节点的结构体:

struct Node {  int data;  struct Node* next;  
};

然后,我们可以定义一个函数来计算两个节点之间的距离:

int getDistance(struct Node* head, int x, int y) {  struct Node* ptr1 = head;  struct Node* ptr2 = head;  int distance = 0;  while(ptr1 != NULL && ptr2 != NULL) {  if(ptr1->data == x) {  ptr2 = ptr2->next;  } else {  ptr1 = ptr1->next;  }  if(ptr2 != NULL && ptr2->data == y) {  distance++;  ptr2 = ptr2->next;  } else {  ptr2 = ptr2->next;  }  }  return distance;  
}

        在上述代码中,我们使用两个指针 ptr1 和 ptr2 来遍历链表。指针 ptr1 用于寻找节点 x,而指针 ptr2 用于寻找节点 y。如果在遍历过程中找到 x,则我们将 ptr2 移动到下一个节点。如果在遍历过程中找到 y,则我们增加距离并移动 ptr2 到下一个节点。否则,我们继续移动 ptr1 和 ptr2 到下一个节点。当 ptr1 或 ptr2 到达链表的末尾时,我们就停止遍历。最后,返回的距离就是两个节点之间的距离。

请注意,这个函数假设 x 和 y 是存在于链表中的实际值,并且它返回的是这两个值之间的最短距离。如果链表中不存在这些值,或者如果它们不存在于同一个链表中,那么函数将返回0。

4,实现循环队列。

以下是用C语言实现循环队列的示例代码:

#include <stdio.h>  
#include <stdlib.h>  #define MAX_SIZE 5  typedef struct {  int data[MAX_SIZE];  int front;  int rear;  
} Queue;  void initQueue(Queue *q) {  q->front = 0;  q->rear = 0;  
}  int isQueueEmpty(Queue *q) {  return (q->front == q->rear);  
}  int isQueueFull(Queue *q) {  return ((q->rear + 1) % MAX_SIZE == q->front);  
}  void enqueue(Queue *q, int x) {  if (isQueueFull(q)) {  printf("Queue is full.\n");  return;  }  q->data[q->rear] = x;  q->rear = (q->rear + 1) % MAX_SIZE;  
}  int dequeue(Queue *q) {  int x;  if (isQueueEmpty(q)) {  printf("Queue is empty.\n");  exit(0);  }  x = q->data[q->front];  q->front = (q->front + 1) % MAX_SIZE;  return x;  
}  void printQueue(Queue *q) {  if (isQueueEmpty(q)) {  printf("Queue is empty.\n");  return;  }  printf("Queue elements: ");  int i = q->front;  while (i != q->rear) {  printf("%d ", q->data[i]);  i = (i + 1) % MAX_SIZE;  }  printf("\n");  
}  int main() {  Queue q;  initQueue(&q);  enqueue(&q, 10);  enqueue(&q, 20);  enqueue(&q, 30);  printQueue(&q);  printf("Dequeue element: %d\n", dequeue(&q));  printQueue(&q);  enqueue(&q, 40);  enqueue(&q, 50);  printQueue(&q);  enqueue(&q, 60);  printf("Dequeue element: %d\n", dequeue(&q));  printf("Dequeue element: %d\n", dequeue(&q));  printf("Dequeue element: %d\n", dequeue(&q));  printf("Dequeue element: %d\n", dequeue(&q));  printf("Dequeue element: %d\n", dequeue(&q));  return 0;  
}

5,实现静态数组的排序算法(冒泡排序、插入排序等)。

这里是使用 C 语言实现静态数组排序算法(冒泡排序和插入排序)的示例代码。

冒泡排序:

#include <stdio.h>  void bubbleSort(int arr[], int n) {  int i, j, temp;  for (i = 0; i < n-1; i++) {  for (j = 0; j < n-i-1; j++) {  if (arr[j] > arr[j+1]) {  temp = arr[j];  arr[j] = arr[j+1];  arr[j+1] = temp;  }  }  }  
}  int main() {  int arr[] = {64, 34, 25, 12, 22, 11, 90};  int n = sizeof(arr)/sizeof(arr[0]);  bubbleSort(arr, n);  printf("Sorted array: \n");  for(int i=0; i < n; i++) {  printf("%d ", arr[i]);  }  return 0;  
}

插入排序:

#include <stdio.h>  void insertionSort(int arr[], int n) {  int i, key, j;  for (i = 1; i < n; i++) {  key = arr[i];  j = i - 1;  while (j >= 0 && arr[j] > key) {  arr[j+1] = arr[j];  j = j - 1;  }  arr[j+1] = key;  }  
}  int main() {  int arr[] = {64, 34, 25, 12, 22, 11, 90};  int n = sizeof(arr)/sizeof(arr[0]);  insertionSort(arr, n);  printf("Sorted array: \n");  for(int i=0; i < n; i++) {  printf("%d ", arr[i]);  }  return 0;  
}

这两个算法都是对静态数组进行排序的基础算法。在 main 函数中,我们定义了一个静态数组,并对其进行排序,然后输出排序后的数组。

http://www.lryc.cn/news/247838.html

相关文章:

  • SQL Server实现参数化增删改查Class类
  • 【Linux】 sudo命令使用
  • Redis key的类型以及命令
  • 数组元素积的符号
  • 数据脱敏方案
  • 蓝桥杯每日一题2023.11.28
  • 【数据库连接池】01:连接池初始化
  • Java基于springboot开发的土特产网站商城多商家源码
  • Linux CentOS7 LVM
  • ArkTS开发webview,html页面中的input和按钮等操作均无响应 【Bug已解决-鸿蒙开发】
  • 滴滴、阿里云、语雀相继宕机,损失巨大,软件的高可用失效了么?
  • 基于binlog实现一些业务(Binlog4j)
  • python实现rpc的几种方式(SimpleXMLRPCServer 自带的、第三方ZeroRPC)、连接linux远程开发分布式锁、分布式id
  • ARM麒麟V10 auditctl启动失败处理
  • day67
  • 04:2440---内存控制器
  • 【深度学习】CNN中pooling层的作用
  • 基于H1ve一分钟搭好CTF靶场
  • 网络篇---第五篇
  • Git——Git应用入门
  • 【SpringBoot】Redisson 分布式锁注解和 @Transactional 注解一起使用问题
  • Druid数据库连接池框架
  • Python项目打包
  • ASUS(华硕) B760M-AYW WIFI D4_解决wifi不能使用
  • Postgresql数据库运维统计信息
  • Python3基础
  • 【性能测试】服务器常用的性能指标总结,一文概全...
  • Vue学习笔记-Vuex基本使用
  • vue3中的customRef创建一个自定义的 ref对象
  • 动态规划学习——子序列问题