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

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

请注意,这个函数假设 xy 是存在于链表中的实际值,并且它返回的是这两个值之间的最短距离。如果链表中不存在这些值,或者如果它们不存在于同一个链表中,那么函数将返回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 函数中,我们定义了一个静态数组,并对其进行排序,然后输出排序后的数组。

相关推荐
捕鲸叉2 分钟前
C++设计模式和编程框架两种设计元素的比较与相互关系
开发语言·c++·设计模式
龙的爹23334 分钟前
论文翻译 | The Capacity for Moral Self-Correction in Large Language Models
人工智能·深度学习·算法·机器学习·语言模型·自然语言处理·prompt
鸣弦artha36 分钟前
蓝桥杯——杨辉三角
java·算法·蓝桥杯·eclipse
我是聪明的懒大王懒洋洋40 分钟前
力扣力扣力:动态规划入门(1)
算法·leetcode·动态规划
未知陨落44 分钟前
数据结构——二叉搜索树
开发语言·数据结构·c++·二叉搜索树
丶Darling.44 分钟前
Day44 | 动态规划 :状态机DP 买卖股票的最佳时机IV&&买卖股票的最佳时机III
算法·动态规划
大波V544 分钟前
设计模式-参考的雷丰阳老师直播课
java·开发语言·设计模式
无敌最俊朗@1 小时前
unity3d————接口基础知识点
开发语言·c#
一丝晨光1 小时前
gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?
c语言·开发语言·c++·gnu·clang·gcc·g++
南城花随雪。2 小时前
Spring框架之装饰者模式 (Decorator Pattern)
java·开发语言·装饰器模式