1.快速排序
#include <iostream>
using namespace std;
const int MAXN=10010;
int a[MAXN];
int Partition(int a[],int low,int high)
{
int temp=a[low];
while(low<high)//新的感悟:循环中必须先从high开始,因为最开始只有low的位置可以被覆盖
{
while(low<high&&a[high]>=temp)
high--;
a[low]=a[high];//执行此句后必须转移到low
while(low<high&&a[low]<=temp)
low++;
a[high]=a[low];//执行此句后必须转移
}
a[low]=temp;
return low;
}
void QuickSort(int a[],int low,int high)
{
if(low<high){
int m=Partition(a,low,high);
QuickSort(a,m+1,high);
QuickSort(a,low,m-1);
}
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
QuickSort(a,1,n);
for(int i=1;i<=n;i++){
cout<<a[i]<<endl;
}
return 0;
}
2.归并排序
3.二分搜索(非递归)
3.二分搜索(递归)
#include <iostream>
using namespace std;
const int maxn=10010;
int a[maxn];
int BinarySearch(int a[],int left,int right,int k){
if(left<=right){
int mid=(left+right)/2;
if(a[mid]==k) return mid;
else if(a[mid]>k) return BinarySearch(a,left,mid-1,k);//return不可省略;
else return BinarySearch(a,mid+1,right,k);//两处return均不可省略,一旦省略,即使找到,仍有可能会输出-1;
}
return -1;
}
int main(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int ans=BinarySearch(a,1,n,k);
cout<<ans;
}
二分——木板切割(算法笔记P134)
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1010;
int a[maxn];
int k,n;
int solve(int a[],int left,int right){
int mid;
while(left<right){//一定会存在的循环条件为left<right,可能不存在的循环条件为left<right,如二分搜索。(此处算法笔记二分部分有详细解释)
int num=0;
mid=(right+left)/2;
for(int i=0;i<n;i++){
num+=a[i]/mid;
}
if(num>k) left=mid;
else if(num<k) right=mid;
else return mid;
}
}
int main(){
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
cout<<solve(a,0,a[n-1]);
}