蓝桥杯练习题——数组查找与替换以及快速排序的用法

蓝桥杯练习题——数组查找与替换

以及快速排序(常用排序方法的一种)的用法

给定某整数数组和某一整数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;
}

以下是运行结果:
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值