目录
问题 A: 线性搜索
题目描述
请编写一个程序,输入包含n(n<=10000)个整数的数列S以及包含q个(q<=500)不重复整数的数列T,输出既包含于T也包含于S的整数的个数C。S、T中的元素均大于0且小于109,T的元素不重复。
输入
多组输入。
每一组输入的第一行输入n,第二行输入代表S的n个整数,第三行输入q,第四行输入代表T的q个整数。输出
用1行输出C。
样例输入 Copy
5 1 2 3 4 5 3 3 4 1样例输出 Copy
3
#include <stdio.h>
#define N 10000
int main() {
int n, t, i, j;
long long count;
long long a[N],b[N];
while (scanf("%d", &n) != EOF) {
for (i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
}
scanf("%d", &t);
for (i = 1; i <= t; i++) {
scanf("%lld", &b[i]);
}
count = 0;
for (i = 1; i <= n; i++) {
for (j = 1; j <= t; j++) {
if (b[j] == a[i]) {
count++;
}
}
}
printf("%lld\n",count);
}
return 0;
}
问题 B: 二分搜索(递归)
tips:题目要求使用二分搜索来写的话,相当于输入的数组已经是有序数组了,所以不需要排序
题目描述
使用递归算法,实现二分搜索。
输入
多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。
输出
输出待查询值所在的位置,如果没有找到,则返回-1。
样例输入 Copy
3 1 2 3 2 4 0 1 3 4 2样例输出 Copy
2 -1
#include <stdio.h>
#define N 100000
int fun(int a[],int left,int right,int target){
if(left > right) return -1;
int mid = left + (right - left) / 2;
if (a[mid] == target) {
return mid;
} else if (a[mid] < target) {
return fun(a,mid + 1, right, target);
} else {
return fun(a,1, mid - 1, target);
}
}
int main() {
int n, k;
int a[N];
while(scanf("%d", &n)!=EOF){
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
scanf("%d", &k);
int s = fun(a,0,n-1,k);
if(s!=-1) printf("%d\n",s+1);
else printf("-1\n");
}
return 0;
}
问题 C: 二分搜索(非递归)
题目描述
使用非递归算法,实现二分搜索。
输入
多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。
输出
输出待查询值所在的位置,如果没有找到,则返回-1。
样例输入 Copy
3 1 2 3 2 4 0 1 3 4 2样例输出 Copy
2 -1
#include <stdio.h>
#define N 100000
int fun(int a[], int n, int target) {
int left = 0;
int right = n - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (a[mid] == target) {
return mid;
} else if (a[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
int main() {
int n, k;
int a[N];
while(scanf("%d", &n)!=EOF){
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
scanf("%d", &k);
int s = fun(a, n, k);
if (s != -1) {
printf("%d\n", s + 1);
} else {
printf("-1\n");
}
}
return 0;
}
问题 D: 用二分搜索试试
题目描述
请编写一个程序,输入包含n(n<=100000)个整数的数列S以及包含q个(q<=50000)不重复整数的数列T,输出既包含于T也包含于S的整数的个数C。S、T中的元素均大于0且小于109。S的元素按升序排列,T的元素不重复。
输入
第一行输入n,第二行输入代表S的n个整数,第三行输入q,第四行输入代表T的q个整数。
输出
用1行输出C。
样例输入 Copy
5 1 2 3 4 5 3 3 4 1样例输出 Copy
3
#include <stdio.h>
#define N 1000010
int main() {
int a[N], b[N];
int n, m, i, l, r, mid, count = 0;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
scanf("%d", &m);
for (i = 0; i < m; i++) {
scanf("%d", &b[i]);
}
for (i = 0; i < m; i++) {
l = 0;
r = n - 1;
// 二分查找
while (l <= r) {
mid = l + (r - l) / 2;
if (a[mid] >= b[i]) {
r = mid - 1;
} else {
l = mid + 1;
}
}
if (l < n && a[l] == b[i]) {
count++;
}
}
printf("%d\n", count);
return 0;
}
问题 E: 例题6-3 冒泡排序
题目描述
从键盘上输入10个整数,用冒泡法对这10个数进行排序(由小到大)。【必须使用冒泡排序实现】
输入
以空格分隔的10个整数
输出
依次输出排好序的10个整数,每个数占一行。
样例输入 Copy
1 3 5 7 9 2 4 6 8 0样例输出 Copy
0 1 2 3 4 5 6 7 8 9
#include <stdio.h>
int main() {
int a[10];
for(int i = 0;i < 10;i++){
scanf("%d", &a[i]);
}
for(int i = 0;i < 10;i++){
for(int j = 0;j < 10 - 1- i;j++){
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for(int i = 0;i < 10;i++){
printf("%d\n",a[i]);
}
return 0;
}
问题 F: 快速排序
题目描述
编程实现快速排序算法,深入理解快速排序算法的基本思想。
输入
多组输入,每组第一个数字为数组长度,然后输入一个一维整型数组。
输出
输出快速排序之后的一维整型数组(升序)
样例输入 Copy
6 1 8 6 5 3 4 5 12 42 2 5 8样例输出 Copy
1 3 4 5 6 8 2 5 8 12 42
#include <stdio.h>
#define N 10000
// 交换函数
void swap(int a[], int i, int j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
// 分区函数
int partition(int a[], int p, int q) {
int x = a[p];
int i = p + 1;
for (int j = p + 1; j <= q; j++) {
if (a[j] <= x) {
swap(a, i, j);
i++;
}
}
swap(a, p, i - 1);
return i - 1; // 返回基准的索引
}
// 快速排序函数
void quicksort(int a[], int p, int q) {
if (p < q) {
int r = partition(a, p, q);
quicksort(a, p, r - 1);
quicksort(a, r + 1, q);
}
}
int main() {
int a[N], n, i;
while (scanf("%d", &n) != EOF) {
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
quicksort(a, 0, n - 1); // 从索引0到n-1对数组进行排序
for (i = 0; i < n; i++) {
printf("%d\n", a[i]);
}
}
return 0;
}