主要针对NOJ及C程序考试,总结一些c++中用STL实现的功能
1.快排(递归实现)
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right) return;
temp=a[left]; //temp中存的就是基准数
i=left; j=right;
while(i!=j)
{ //顺序很重要,要先从右边开始找
while(a[j]>=temp && i<j) j--; //再找右边的
while(a[i]<=temp && i<j) i++; //交换两个数在数组中的位置
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
} //最终将基准数归位
a[left]=a[i]; a[i]=temp;
quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程
quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程
}
2.循环赛日程表
void table(int k)//共2^k个人
{
int n=1;
for(int i=1;i<=k;i++) n*=2;
for(int i=1;i<=n;i++) a[1][i]=i;
int m=1;
for(int s=1;s<=k;s++)
{
n/=2;
for(int t=1;t<=n;t++)
for(int i=m+1;i<=2*m;i++)
for(int j=m+1;j<=2*m;j++)
{
a[i][j+(t-1)*m*2]=a[i-m][j+(t-1)*m*2-m];
a[i][j+(t-1)*m*2-m]=a[i-m][j+(t-1)*m*2];
}
m*=2;
}
}
3.穷举所有排列
int n;
char a[12] ={0,'a','b','c','d','e','f','g','h','i','j','k'};
void dfs(int k)
{
if (k==n)
{
for(int i=1;i<=n;i++)
cout<<a[i];
cout<<endl;
return;
}
for (int i=k+1;i<=n;i++)
{
swap(a[i],a[k+1]);
dfs(k+1);
swap(a[i],a[k+1]);
}
}
4.归并排序
void Merge(int arr[],int l,int mid,int r)
{
int aux[r-l+1];//开辟一个新的数组,将原数组映射进去
for(int m=l;m<=r;m++)
{
aux[m-l]=arr[m];
}
int i=l,j=mid+1;//i和j分别指向两个子数组开头部分
for(int k=l;k<=r;k++)
{
if(i>mid)
{
arr[k]=aux[j-l];
j++;
}
else if(j>r)
{
arr[k]=aux[i-l];
i++;
}
else if(aux[i-l]<aux[j-l])
{
arr[k]=aux[i-l];
i++;
}
else
{
arr[k]=aux[j-l];
j++;
}
}
}
//递归的使用归并排序,对arr[l....r]排序
void merge_sort(int arr[],int l,int r)
{
if(l >=r)
return ;
int mid=(l+r)/2;
merge_sort(arr,l,mid);
merge_sort(arr,mid+1,r);
Merge(arr,l,mid,r);
}
接口:merge_sort(arr,0,n-1);