快速排序和快速幂取模

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

1018 排序

给出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

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


给出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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值