2024年春季学期《算法分析与设计》练习4

目录

问题 A: 线性搜索

问题 B: 二分搜索(递归)

问题 C: 二分搜索(非递归)

问题 D: 用二分搜索试试

问题 E: 例题6-3 冒泡排序

问题 F: 快速排序


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值