基于51nod上的1018和1046来讨论快速排序和快速幂取模
给出N个整数,对着N个整数进行排序
Input
第1行:整数的数量N(1 <= N <= 50000) 第2 - N + 1行:待排序的整数(-10^9 <= A[i] <= 10^9)
Output
共n行,按照递增序输出排序好的数据。
Input示例
5 5 4 3 2 1
Output示例
1 2 3 4 5
![快排图](https://i-blog.csdnimg.cn/blog_migrate/571577af23a6f8a4f90e35ed68d8d8a9.gif)
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给
key,即
key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于
key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于
key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于
key,4中A[i]不大于
key的时候改变j、i的值,使得j--,i++,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
(复杂度O(nlog n))
AC代码:
(复杂度O(nlog n))
AC代码:
#include <stdio.h>
int quicksort(int s[],int l,int r)
{
if(l>r)return 1;
int i,j,key;
i=l;j=r;key=s[l];
while(i<j)
{
while(i<j&&key<=s[j])
j--;
s[i]=s[j];
while(i<j&&key>=s[i])
i++;
s[j]=s[i];
}
s[i]=key;
quicksort(s,l,i-1);
quicksort(s,i+1,r);
return 1;
}
int main()
{
int s[50005],N,i;
while(scanf("%d",&N)!=EOF)
{
for(i=0;i<N;i++)
scanf("%d",&s[i]);
quicksort(s,0,N-1);
for(i=0;i<N;i++)
printf("%d\n",s[i]);
}
return 0;
}
给出3个正整数A B C,求A^B Mod C。
例如,3 5 8,3^5 Mod 8 = 3。
Input
3个正整数A B C,中间用空格分隔。(1 <= A,B,C <= 10^9)
Output
输出计算结果
Input示例
3 5 8
Output示例
3
![](https://i-blog.csdnimg.cn/blog_migrate/c15445c97a69ba6255e6dee72664d24e.jpeg)
快速幂取模算法实际上取决于上述公式,当我们令a = (a * a) mod c时,我们所要求的最终结果即为(a)^ (b/2) mod c而不是原来的a^b mod c,我们发现这个过程是可以迭代下去的。当然,对于奇数的情形会多出一项a mod c,所以为了完成迭代,当b是奇数时,我们通过d=(d*a) mod c;来弥补多出来的这一项,此时剩余的部分就可以进行迭代了。
复杂度O(log n)
AC代码:
#include<stdio.h>
int main()
{
long long a,b,c,d;
while(scanf("%lld %lld %lld",&a,&b,&c)!=EOF)
{
d=1;
while(b>0)
{
if(b%2==1)
d=(d*a) % c;
b=b/2;
a=(a*a) % c;
}
printf("%lld\n",d);
}
return 0;
}