2024.7.23学习笔记

目录

排序

一、选择排序

二、冒泡排序

三、插入排序

四、计数排序

五、归并排序


排序

一、选择排序

1.

/*颜色分类,按红、白、蓝(0,1,2)顺序排序*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int arr[MAX];
void _solve(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>arr[i];
	for(int i=0;i<n;i++){
		int _min=i;//记录最小值的下标 
		for(int j=i+1;j<n;j++){
			if(arr[j]<arr[_min]){  
				_min=j;//更新最小值的下标 
			}
		}
		int t=arr[_min];
		arr[_min]=arr[i];
		arr[i]=t;//将最小值与其第i个元素交换 
	}
	int flag=1;
	cout<<"["; 
	for(int i=0;i<n;i++){
		if(flag) cout<<arr[i],flag=0;
		else cout<<","<<arr[i];
	}
	cout<<"]"<<endl;
} 
int main(){
	_solve();
	return 0;
}

2.

/*两数组的中位数*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
double nums1[MAX],nums2[MAX];
void _solve(){
	int n,m;
	cin>>n>>m;
	for(int i=0;i<n;i++)
	cin>>nums1[i];
	for(int j=0;j<m;j++)
	cin>>nums2[j];
	int len=0;
	for(int i=n;i<n+m;i++){
		nums1[i]=nums2[len++];
	}
	for(int i=0;i<n+m;i++){
		int _min=i;//记录最小值的下标 
		for(int j=i+1;j<n+m;j++){
			if(nums1[j]<nums1[_min]){  
				_min=j;//更新最小值的下标 
			}
		}
		int t=nums1[_min];
		nums1[_min]=nums1[i];
		nums1[i]=t;//将最小值与其第i个元素交换 
	}
	cout<<"合并后的数组为:[";
	int flag=1; 
	for(int i=0;i<n+m;i++)
	{
		if(flag) cout<<nums1[i],flag=0;
		else cout<<","<<nums1[i];
	}
	cout<<"] ,该数组的中位数为:"; 
	if((n+m)%2){
		cout<<nums1[(n+m)/2]<<endl;
	}
	else cout<<(nums1[(n+m)/2-1]+nums1[(n+m)/2])/2.0<<endl;
} 
int main(){
	_solve();
	return 0;
}

3.

/*至少是其他数字两倍的最大数,如果是,则返回最大元素的下标,否则返回-1*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int nums[MAX];
int PD_nums(int n){
	int max=0;
	for(int i=1;i<n;i++){
		if(nums[i]>nums[max]) max=i;
	}
	for(int i=0;i<n;i++){//选择排序 
		int min=i;
		for(int j=i+1;j<n;j++){
			if(nums[j]<nums[i]){
				min=j;//更新最小值下标 
			}
		}
		//将最小值与其第i个元素交换  
		int t=nums[min];
		nums[min]=nums[i];
		nums[i]=t; 
	}
	if(nums[n-1]>=2*nums[n-2]){
		return max;
	} 
    return -1;
} 
void _solve(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>nums[i];
	cout<<PD_nums(n)<<endl;
}
int main(){
	_solve();
	return 0;
}

二、冒泡排序

1.

/*合并两个有序数组*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int nums1[MAX],nums2[MAX]; 
void _solve(){
	int n,m;
	cin>>n>>m;
	for(int i=0;i<n;i++)
	cin>>nums1[i];
	for(int j=0;j<m;j++)
	cin>>nums2[j];
	int len=0;
	for(int i=n;i<n+m;i++)//合并 
	nums1[i]=nums2[len++];
	for(int i=0;i<n+m-1;i++){//冒泡排序 
		for(int j=0;j<n+m-1-i;j++){
			if(nums1[j]>nums1[j+1])//从小到大排 
			{
				int t=nums1[j];
				nums1[j]=nums1[j+1];
				nums1[j+1]=t;
			} 
		}
	} 
	int flag=1;
	cout<<"["; 
	for(int i=0;i<n+m;i++)
	{
		if(flag) cout<<nums1[i],flag=0;
		else cout<<","<<nums1[i]; 
	}
	cout<<"]"<<endl;
}
int main(){
	_solve();
	return 0;
}

2.

/*元素计数*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int nums[MAX];
void _solve(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>nums[i];
	for(int i=0;i<n-1;i++){//冒泡排序 
		for(int j=0;j<n-1-i;j++){
			if(nums[j]>nums[j+1]){//从小到大排 
				int t=nums[j];
				nums[j]=nums[j+1];
				nums[j+1]=t;
			}
		}
	}
	int len=0; 
	for(int i=1;i<n-1;i++){
		if(nums[i]!=nums[0]&&nums[i]!=nums[n]){
			len++;
		}
	} 
	cout<<len<<endl;
}
int main(){
	_solve();
	return 0;
} 

3.

/*最后一块石头的重量*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int  arr[MAX];

int pd_arr(int n){
	while(n>1){
		for(int i=0;i<n-1;i++){
		for(int j=0;j<n-1-i;j++){
			if(arr[j]>arr[j+1]){
				int t=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=t;
			}
		}
	}
	int sum=arr[n-1]-arr[n-2];
	n-=2;
	if(sum!=0||n==0){
		arr[n++]=sum;
	} 
	}
	return arr[0];
}
void _solve(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>arr[i];
	cout<<pd_arr(n)<<endl;
}
int main(){
	_solve();
	return 0;
}

三、插入排序

1.

/*去掉最低工资和最高工资后的工资平均值*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
double nums[MAX];
void _solve(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>nums[i];
	for(int i=1;i<n;i++){//选择排序 
		int t=nums[i];
		int j;
		for(j=i-1;j>=0;j--){
			if(t<nums[j])//升序
			{
				nums[j+1]=nums[j];//将下标为j的元素后移 
			} 
			else break; 
		}
		nums[j+1]=t; 
	}
	double sum=0;
	for(int i=1;i<n-1;i++){
		sum+=nums[i];
	} 
	cout<<sum/(n-2)<<endl;
} 
int main(){
	_solve();
	return 0;
}

2.

/*删除元素的数组均值*/ 
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
double arr[MAX];
void _solve(){
	int n;//输入的n为20倍数 
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>arr[i];
	for(int i=1;i<n;i++){
		int j;
		int x=arr[i];
		for(j=i-1;j>=0;j--){
			if(x<arr[j]){
				arr[j+1]=arr[j];
			}
			else break;
		}
		arr[j+1]=x;
	}
	double sum=0;
	int len=0;
	for(int i=n/20;i<n-n/20;i++){
		sum+=arr[i];
		len++;
	}
	cout<<sum/len<<endl;
} 
int main(){
	_solve();
	return 0;
} 

3.

/*学生分数的最小差值*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int nums[MAX];
void _solve(){
	int n,k;
	cin>>n>>k;
	for(int i=0;i<n;i++)
	cin>>nums[i];
	for(int i=1;i<n;i++){//选择排序 
		int t=nums[i];
		int j;
		for(j=i-1;j>=0;j--){
			if(t<nums[j])//升序
			{
				nums[j+1]=nums[j];//将下标为j的元素后移 
			} 
			else break; 
		}
		nums[j+1]=t; 
	}
	int _min=MAX*10;
	for(int i=0;i+k-1<n;i++){
		int l=i;
		int r=i+k-1;
		_min=min(_min,nums[r]-nums[l]);
	}
	cout<<_min<<endl;
} 
int main(){
	_solve();
	return 0;
}

四、计数排序

/*计数排序*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int a[MAX];
void Js_sort(int *a,int n){//计数排序 
	int _max=0;
	for(int i=0;i<n;i++){//记录数组a的最大数 
		if(a[i]>_max){
			_max=a[i];
		}
	}
	int *b=new int[_max+1];//定义个新数组 
	memset(b,0,sizeof(int)*(_max+1));//初始化 
	for(int i=0;i<n;i++){
		b[a[i]]++;//计数 
	} 
	int len=0;
	for(int j=0;j<=_max;j++){//数字小的排前(升序) 
		while(b[j]>0){//遍历0~_max的数 
			a[len++]=j;
			b[j]--;
		}
	}
	//释放b所占的空间 
	delete(b);//delete[] b;
}
void _solve(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>a[i];
	Js_sort(a,n);
	for(int i=0;i<n;i++)
	cout<<a[i]<<" ";
}
int main(){
	int T=1;
	//cin>>T;
	while(T--){
		_solve();
	}
	return 0;
}

五、归并排序

/*归并排序*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int a[MAX];
void merge(int *a,int l,int m,int r){//合并最后的两个有序数组,进行升序排序 
	int n1=m-l+1;//左区域的大小 
	int n2=r-m;//右区域的大小 
	int arr[n1+n2];//定义一个新数组储存 
	memset(arr,0,sizeof(a));//初始化新数组 
	for(int i=0;i<n1;i++){//给新数组先赋值左区域 
		arr[i]=a[l+i];
	}
	for(int j=0;j<n2;j++){//再赋值右区域 
		arr[n1+j]=a[m+1+j];
	}
	int i=0,j=n1,k=l;
	while(i<n1&&j<n1+n2){//比较两边数组的大小 
		if(arr[i]<=arr[j]){//进行升序排序 
			a[k++]=arr[i++];
		}
		else{
			a[k++]=arr[j++];
		}
	}
	/*判断两个数组多出来的部分*/ 
	while(i<n1){
		a[k++]=arr[i++];
	}
	while(j<n1+n2){
		a[k++]=arr[j++];
	}
}
void Gb_sort(int *a,int l,int r){//归并排序 
	if(l>=r){ 
		return ;
	}
	int m=(l+r)/2;//取中间位置 
	Gb_sort(a,l,m);//将从左端点到中间位置递归遍历
	Gb_sort(a,m+1,r);//将从中间的后一个位置与右端点递归遍历
	merge(a,l,m,r);//合并左右两遍历的结果 
}
void _solve(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>a[i];
	Gb_sort(a,0,n-1);//调用排序 
	for(int i=0;i<n;i++)
	cout<<a[i]<<" ";
} 
int main(){
	int T=1;
	//cin>>T;
	while(T--){
		_solve();
	}
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值