快速排序和快速幂取模

来源:互联网 发布:ubuntu ant 编辑:程序博客网 时间:2024/06/06 04:26

基于51nod上的1018和1046来讨论快速排序和快速幂取模

1018 排序

给出N个整数,对着N个整数进行排序
Input
第1行:整数的数量N(1 <= N <= 50000)第2 - N + 1行:待排序的整数(-10^9 <= A[i] <= 10^9)
Output
共n行,按照递增序输出排序好的数据。
Input示例
554321
Output示例
12345

快排图
一趟快速排序的算法是:
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代码:
#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;}




1046 A^B Mod C
给出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

快速幂取模算法实际上取决于上述公式,当我们令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;}


1 0
原创粉丝点击