目录
排序
一、选择排序
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;
}