排序
内定义数据类型
bool cmp(int &a,int &b)
{
return a>b;//降序
}
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&data[i]);
}
sort(data,data+n,cmp);
for(int i=0;i<n;i++)
{
printf("%d ",data[i]);
}
printf("\n");
}
自定义数据类型
- 设计比较函数
bool compare(student x,student y)
{
if(x.score==y.score)
{
return x.num<y.num;
}else{
return x.score<y.score;
}
}
- 定义大小关系
struct student
{
int num;
int score;
bool operator<(student s)const
{
if(score==s.score)
{
return num<s.num;
}else
{
return score<s.score;
}
}
};
eg:整数奇偶排序
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int arr[10];
bool cmp(int x,int y)
{
if(x%2==1&&y%2==1){
return x>y;
}else if(x%2==0&&y%2==0){
return x<y;
}else if(x%2==1&&y%2==0){
return true;
}else{
return false;
}
}
int main()
{
while(scanf("%d",&arr[0])!=EOF)
{
for(int i=1;i<10;++i)
{
scanf("%d",&arr[i]);
}
sort(arr,arr+10,cmp);
for(int i=0;i<10;++i)
{
printf("%d ",arr[i]);
}
printf("\n");
}
return 0;
}
排序算法的特性
线性排序——计数排序
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=1e6+10;
const int RANGE=5e5;
int arr[MAXN];
int number[MAXN];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(number,0,sizeof(number));//清空数组,设为0
for(int i=0;i<n;++i)
{
scanf("%d",&arr[i]);
number[arr[i]+RANGE]++;
}
int index=0;
for(int i=0;i<MAXN;++i)
{
while(number[i]--)
{
arr[index++]=i-RANGE;
}
}
for(int i=n-1;i>=n-m;--i)
{
if(i==n-m)
{
printf("%d\n",arr[i]);
}
else
{
printf("%d ",arr[i]);
}
}
}
return 0;
}
逆序数对——归并排序
#include<iostream>
#include<cstdio>
using namespace std;
int arr[100];
int temp[100];
int number;
void combine(int left,int middle,int right)
{
int i=left;
int j=middle+1;
int k=left;
while(i<=middle&&j<=right)
{
if(arr[i]<=arr[j])
{
temp[k++]=arr[i++];
}else
{
number+=middle-i+1;//求逆序数
temp[k++]=arr[j++];
}
}
while(i<=middle)
{
temp[k++]=arr[i++];
}
while(j<=right)
{
temp[k++]=arr[j++];
}
for(k=left;k<=right;++k)
{
arr[k]=temp[k];
}
return;
}
void MergeSort(int left,int right)
{
if(left<right)
{
int middle=left+(right-left)/2;
MergeSort(left,middle);
MergeSort(middle+1,right);
combine(left,middle,right);
}
return;
}
int main()
{
int n;
number=0;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d",&arr[i]);
}
MergeSort(0,n-1);
for(int i=0;i<n;++i)
{
printf("%d ",arr[i]);
}
printf("\n");
printf("%d\n",number);
return 0;
}
第K大数——快速排序
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int arr[100];
int Partition(int left,int right)
{
int random=left+rand()%(right-left);
swap(arr[left],arr[random]);
while(left<right)
{
while(left<right&&arr[left]<=arr[right])
{
--right;
}
swap(arr[left],arr[right]);
while(left<right&&arr[left]<=arr[right])
{
++left;
}
swap(arr[left],arr[right]);
}
return left;
}
void quicksort(int left,int right)
{
if(left<right)
{
int position=Partition(left,right);
quicksort(left,position-1);
quicksort(position+1,right);
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d",&arr[i]);
}
quicksort(0,n-1);
for(int i=0;i<n;++i)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
修改版
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int arr[100];
int Partition(int left,int right)
{
int random=left+rand()%(right-left);
swap(arr[left],arr[random]);
while(left<right)
{
while(left<right&&arr[left]<=arr[right])
{
--right;
}
swap(arr[left],arr[right]);
while(left<right&&arr[left]<=arr[right])
{
++left;
}
swap(arr[left],arr[right]);
}
return left;
}
int quicksort(int left,int right,int k)
{
int position=Partition(left,right);
if(position==k-1)
{
return arr[position];
}else if(position<k-1)
{
return quicksort(position+1,right,k);
}else
{
return quicksort(left,position-1,k);
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
scanf("%d",&arr[i]);
}
int k;
scanf("%d",&k);
printf("%d\n",quicksort(0,n-1,k));
return 0;
}
查找
线性查找——O(n)
二分查找——有序 O(logn)
1.自定义
2.系统自带:lower_bound(>=)、upper_bound(>) ps:返回的是地址
散列查找——O(1)
1.自定义
2.系统自带:unordered_map(映射)
#include<unordered_map>
unordered_map<int,bool> hashTable;