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