蓝桥杯练习题——数组查找与替换
以及快速排序(常用排序方法的一种)的用法
给定某整数数组和某一整数b。要求删除数组中可以被b整除的所有元素,同时将该数组各元素按从小到大排序。如果数组元素数值在A到Z的ASCII之间,替换为对应字母。元素个数不超过100,b在1至100之间。
输入描述:
第一行为数组元素个数和整数b
第二行为数组各个元素
这道题按照要求可以分为三步:
1.找到被b整除的元素并删除
2.将数组按照从小到大的顺序排序
3.找到对应的字母替换元素并输出数组
(删除元素可以按照顺序表删除元素的方法,这里就不提了)
下面我们来看代码:
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a,const void *b) { // 用于快排中的比较函数
return *(int *)a-*(int *)b;
}
int main(void) {
int i,j,n,b,a[105];
scanf("%d%d",&n,&b); // 按题目要求输入
for(i = 0; i < n; i++) {
scanf("%d",&a[i]);
}
for(i = 0; i < n; i++) { // 找到元素并删除
if(a[i] % b == 0) {
for(j = i; j < n; j++) {
a[j] = a[j + 1];
}
n--;
i--;
}
}
qsort(a,n,sizeof(int),cmp); // 排序
for(i = 0; i < n; i++) { // 按要求输出
if(a[i] >= 65 && a[i] <= 90) {
printf("%c ",a[i]);
}
else
printf("%d ",a[i]);
}
return 0;
}
快排的用法
首先快速排序在<stdlib.h>中可以调用
qsort(arr,n,sizeof(arr[0]),cmp);
qsort(待排序的数组首地址,待排序元素的个数,数组每个元素的大小,cmp为指向比较函数的指针) (比较函数可任意命名)
compar函数
对int类型数组排序
int cmp(const void *a,const void *b){
return *(int *)a - *(int *)b; // 升序排列
// return *(int *)a - *(int *)b; 降序排列
}
对char类型数组排序
int cmp(const void *a,const void *b){
return *(char *)a - *(char *)b; // 升序排列
// return *(char *)a - *(char *)b; 降序排列
}
对字符串类型数组排序
int cmp(const void *a,const void *b){
return strcmp((char *)a,(char *)b);
}
对double类型数组排序
int cmp(const void *a,const void *b){
return *(double *)a > *(double *)b ? 1 : -1;
}
(%g输出可以去掉无意义的零)
c++自带sort()的用法
C中的qsort()采用的是快排算法,C++的sort()则是改进的快排算法。两者的时间复杂度都是n*(logn),但是实际应用中,sort()一般要快些,建议使用sort()。
STL中就自带了排序函数sortsort 对给定区间所有元素进行排序 要使用此函数只需用#include
用法:sort(begin,end)
int main(void) {
int n; // 要排序的数字个数
int a[10];
cin >> n;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a,a + n);
for(int i = 0; i < n; i++) {
cout << a[i] << " ";
}
return 0;
}
以下是运行结果: