目录
MT1401·归并排序
MT1402·堆排序
MT1403·后3位排序
MT1404·小大大小排序
MT1405·小大大小排序II
MT1406·数字重排
MT1407·插入
MT1408·插入
MT1409·旋转数组
MT1410·逆时针旋转数组
MT1401·归并排序

c 语言实现代码
#include <stdio.h>
// merge two subarrays
void merge(int arr[], int left, int mid, int right) {
    int i, j, k;
    int n1 = mid - left + 1; // left sonArray
    int n2 = right - mid;    // right sonArray
    // create new array
    int L[n1], R[n2];
    for (i = 0; i < n1; i++) {
        L[i] = arr[left + i];
    }
    for (j = 0; j < n2; j++) {
        R[j] = arr[mid + 1 + j];
    }
    i = 0;
    j = 0;
    k = left;
    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 left, int right) {
    if (left < right) {
        int mid = left + (right - left) / 2;
        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);
        merge(arr, left, mid, right);
    }
}
int main() {
    int arr[10];
    for (int i = 0; i < 10; i++) {
        scanf("%d", &arr[i]);
    }
    mergeSort(arr, 0, 10 - 1);
    for (int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}MT1402·堆排序
 
 
c 语言实现代码
#include <stdio.h>
// swap two element vlaue
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
void heapify(int arr[], int n, int i) {
    int largest = i;       // root 节点
    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) {
        swap(&arr[i], &arr[largest]);
        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--) {
        swap(&arr[0], &arr[i]);
        heapify(arr, i, 0);
    }
}
int main() {
    int arr[10];
    for (int i = 0; i < 10; i++) {
        scanf("%d", &arr[i]);
    }
    heapSort(arr, 10);
    for (int i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}MT1403·后3位排序
 
 
c 语言代码实现
#include <stdio.h>
#include <stdlib.h>
#define N 10
int compare(const void *a, const void *b) {
    int num1 = *(int *)a;
    int num2 = *(int *)b;
    int last_1 = num1 % 1000;
    int last_2 = num2 % 1000;
    if (last_1 != last_2) {
        return last_1 - last_2;
    } else {
        return num2 - num1;
    }
}
int main() {
    int numbers[N];
    for (int i = 0; i < N; i++) {
        scanf("%d", &numbers[i]);
    }
    qsort(numbers, N, sizeof(10), compare);
    for (int i = 0; i < N; i++) {
        printf("%d ", numbers[i]);
    }
    return 0;
}MT1404·小大大小排序
 
c 语言代码实现
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
// 升序排序的比较函数
int ascending(const void *a, const void *b) { return (*(int *)a - *(int *)b); }
// 反转函数 用于将下标N到M的元素反转
void reverse(int arr[], int start, int end) {
    while (start < end) {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        start++;
        end--;
    }
}
int main() {
    int arr[SIZE];
    int N, M;
    for (int i = 0; i < SIZE; i++) {
        scanf("%d", &arr[i]);
    }
    scanf("%d %d", &N, &M);
    // 对整个数组进行升序排序
    qsort(arr, SIZE, sizeof(int), ascending);
    // 反转下标 N 到 M 的部分
    reverse(arr, N, M);
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}MT1405·小大大小排序II
 
c 语言代码实现
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
// 升序排序的比较函数
int ascending(const void *a, const void *b) { return (*(int *)a - *(int *)b); }
// 反转函数 用于将下标N到M的元素反转
void reverse(int arr[], int start, int end) {
    while (start < end) {
        int temp = arr[start];
        arr[start] = arr[end];
        arr[end] = temp;
        start++;
        end--;
    }
}
int main() {
    int arr[SIZE];
    int N;
    for (int i = 0; i < SIZE; i++) {
        scanf("%d", &arr[i]);
    }
    scanf("%d", &N);
    // 对整个数组进行升序排序
    qsort(arr, SIZE, sizeof(int), ascending);
    // 反转下标 N 到 M 的部分
    reverse(arr, N, SIZE - 1);
    for (int i = 0; i < SIZE; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}MT1406·数字重排

这道题 c 案例一直出问题 有解决的可以在评论区d我
c 语言实现
#include <stdio.h>
#include <stdbool.h>
// 去重函数:从数组a中去重,结果存入数组b,返回去重后的长度
int del(int a[], int b[], int n) {
    int c = 0;
    for (int i = 0; i < n; i++) {
        bool flag = true;
        for (int j = 0; j < c; j++) {
            if (a[i] == b[j]) { // 如果a[i]已在b中,设置标志为false
                flag = false;
                break;
            }
        }
        if (flag) { // 如果a[i]不在b中,加入b
            b[c++] = a[i];
        }
    }
    return c;
}
// 排序函数
void sort(int arr[], int len) {
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}
int main() {
    int a, b, c, len = 0;
    // 输入三个数字
    scanf("%d %d %d", &a, &b, &c);
    int A[6], B[6];
    A[len++] = a * 100 + b * 10 + c;
    A[len++] = a * 100 + c * 10 + b;
    A[len++] = b * 100 + a * 10 + c;
    A[len++] = b * 100 + c * 10 + a;
    A[len++] = c * 100 + a * 10 + b;
    A[len++] = c * 100 + b * 10 + a;
    // 去重
    int newLen = del(A, B, len);
    // 排序
    sort(B, newLen);
    // 输出结果
    for (int i = 0; i < newLen; i++) {
        printf("%d\n", B[i]);
    }
    return 0;
}
MT1407·插入
 
c 语言实现代码
#include <stdio.h>
#define SIZE 10
void sort(int arr[], int len) {
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}
int insertPoistion(int arr[], int len, int n) {
    int left = 0;
    int right = len - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (arr[mid] < n) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return left;
}
int main() {
    int arr[SIZE + 1], n;
    for (int i = 0; i < SIZE; i++) {
        scanf("%d", &arr[i]);
    }
    scanf("%d", &n);
    sort(arr, SIZE);
    int pos = insertPoistion(arr, SIZE, n);
    for (int i = SIZE; i > pos; i--) {
        arr[i] = arr[i - 1];
    }
    arr[pos] = n;
    for (int i = 0; i <= SIZE; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}MT1408·插入

c 语言代码实现
#include <stdio.h>
int insertPosition(int arr[], int len, int n) {
    int left = 0;
    int right = len - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (arr[mid] < n) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return left;
}
int main() {
    int N;
    int array[N + 1];
    int insertNumber;
    scanf("%d", &N);
    for (int i = 0; i < N; i++) {
        scanf("%d", &array[i]);
    }
    scanf("%d", &insertNumber);
    int pos = insertPosition(array, N, insertNumber);
    for (int i = N; i > pos; i--) {
        array[i] = array[i - 1];
    }
    array[pos] = insertNumber;
    for (int i = 0; i < N + 1; i++) {
        printf("%d ", array[i]);
    }
    return 0;
}MT1409·旋转数组
 
 
c 语言代码实现
#include <stdio.h>
void rotate_array(int arr[], int length, int n) {
    // 处理 N 的值,确保在有效范围内
    n = n % length;  // 处理 N 大于数组长度的情况
    if (n < 0) {
        n += length;  // 将负数旋转转换为正数旋转
    }
    // 创建一个临时数组来存储旋转后的结果
    int temp[length];
    // 进行旋转
    for (int i = 0; i < length; i++) {
        temp[(i + n) % length] = arr[i];
    }
    // 将结果复制回原数组
    for (int i = 0; i < length; i++) {
        arr[i] = temp[i];
    }
}
int main() {
    int arr[10];
    int n;
    // 输入整型元素
    for (int i = 0; i < 10; i++) {
        scanf("%d", &arr[i]);
    }
    // 输入旋转次数 N
    scanf("%d", &n);
    // 旋转数组
    rotate_array(arr, 10, n);
    // 输出结果
    for (int i = 0; i < 10; i++) {
        printf("%d", arr[i]);
        if (i < 9) {
            printf(" ");  // 输出空格分隔
        }
    }
    printf("\n");
    return 0;
}
MT1410·逆时针旋转数组

c 语言实现代码
#include <stdio.h>
void rotateArrayCounterClockwise(int array[], int N, int M) {
    M = M % N; // 计算有效的旋转次数
    int result[N];
    // 将前 M 个元素放在新数组的末尾
    for (int i = 0; i < N - M; i++) {
        result[i] = array[M + i];
    }
    // 将前 M 个元素移动到新数组的开头
    for (int i = 0; i < M; i++) {
        result[N - M + i] = array[i];
    }
    // 将新数组的内容复制到原数组
    for (int i = 0; i < N; i++) {
        array[i] = result[i];
    }
}
int main() {
    int N, M;
    scanf("%d %d", &N, &M);
    int array[N];
    for (int i = 0; i < N; i++) {
        scanf("%d", &array[i]);
    }
    rotateArrayCounterClockwise(array, N, M);
    for (int i = 0; i < N; i++) {
        printf("%d ",array[i]);
    }
    return 0;
}


















