PTA基础编程题目集(四)(直接插入排序、希尔排序、大数阶乘、6-10 阶乘计算升级版、6-11 求自定类型元素序列的中位数)

直接插入排序:

https://www.cnblogs.com/skywang12345/p/3596746.html

/*
 * 快速排序
 *
 * 参数说明:
 *     a -- 待排序的数组
 *     l -- 数组的左边界(例如,从起始位置开始排序,则l=0)
 *     r -- 数组的右边界(例如,排序截至到数组末尾,则r=a.length-1)
 */
void quick_sort(int a[], int l, int r)
{
    if (l < r)
    {
        int i,j,x;

        i = l;
        j = r;
        x = a[i];
        while (i < j)
        {
            while(i < j && a[j] > x)
                j--; // 从右向左找第一个小于x的数
            if(i < j)
                a[i++] = a[j];
            while(i < j && a[i] < x)
                i++; // 从左向右找第一个大于x的数
            if(i < j)
                a[j--] = a[i];
        }
        a[i] = x;
        quick_sort(a, l, i-1); /* 递归调用 */
        quick_sort(a, i+1, r); /* 递归调用 */
    }
}  

希尔排序:

https://www.cnblogs.com/skywang12345/p/3597597.html

/*
 * 希尔排序
 *
 * 参数说明:
 *     a -- 待排序的数组
 *     n -- 数组的长度
 */
void shell_sort1(int a[], int n)
{
    int i,j,gap;

    // gap为步长,每次减为原来的一半。
    for (gap = n / 2; gap > 0; gap /= 2)
    {
        // 共gap个组,对每一组都执行直接插入排序
        for (i = 0 ;i < gap; i++)
        {
            for (j = i + gap; j < n; j += gap) 
            {
                // 如果a[j] < a[j-gap],则寻找a[j]位置,并将后面数据的位置都后移。
                if (a[j] < a[j - gap])
                {
                    int tmp = a[j];
                    int k = j - gap;
                    while (k >= 0 && a[k] > tmp)
                    {
                        a[k + gap] = a[k];
                        k -= gap;
                    }
                    a[k + gap] = tmp;
                }
            }
        }

    }
}

6-11 求自定类型元素序列的中位数 (25分)

https://pintia.cn/problem-sets/14/problems/743

思路:第一次用冒泡,超时;后用希尔,过了。

ElementType Median(ElementType A[],int N)
{
	int i,j,gap;
    int n=N;
    // gap为步长,每次减为原来的一半。
    for (gap = n / 2; gap > 0; gap /= 2)
    {
        // 共gap个组,对每一组都执行直接插入排序
        for (i = 0 ;i < gap; i++)
        {
            for (j = i + gap; j < n; j += gap) 
            {
                // 如果a[j] < a[j-gap],则寻找a[j]位置,并将后面数据的位置都后移。
                if (A[j] < A[j - gap])
                {
                    double tmp = A[j];
                    int k = j - gap;
                    while (k >= 0 && A[k] > tmp)
                    {
                        A[k + gap] = A[k];
                        k -= gap;
                    }
                    A[k + gap] = tmp;
                }
            }
        }

    }
    return A[n/2];
} 

 

求大数阶乘:

// 1000 的阶乘 2568 位  
#include <stdio.h>  
  
int a[3000];  
  
void show(int k)  
{  
    int i=0;  
    printf("位数 %d 位\n",k);  
    for (i=k-1; i>=0; i--)  
    {  
        printf("%d",a[i]);  
    }  
}  
  
int fanc(int n)  
{  
    int w=0;  
    int i=0, j=0;  
    int t=n;  
    int k=0;    // 表示数据的位数。    
    while(t)  
    {  
        a[i++] = t%10;  
        t/=10;  
        k++;  
    }  
  
    for (j=n-1; j>1; j--)  
    {  
        w=0;    // 表示进位  
        for (i=0; i<k; i++)  
        {  
            t = a[i]*j+w;  
            a[i] = t%10;  
            w = t/10;  
        }  
  
        while(w)  
        {  
            a[i++] = w%10;  
            w/=10;  
            k++;  
        }  
    }  
    return k;  
}   
int main()  
{  
    int n;  
    int k=0;  
  
    scanf("%d",&n);  
    k = fanc(n);  
    show(k);  
    printf("\n");  
    return 0;  
} 

6-10 阶乘计算升级版 (20分)

https://pintia.cn/problem-sets/14/problems/742

思路:大数阶乘

代码:

void Print_Factorial(const int N)
{  
    int n=N;
    int a[3000]; 
    int w=0;  
    int i=0, j=0;  
    int t=n;  
    int k=0;    // 表示数据的位数。    
    if(n<0) printf("Invalid input\n");
    else if(n==0) 
    {
    	printf("1\n");
	}
    else if(n>0){
    while(t)  
    {  
        a[i++] = t%10;  
        t/=10;  
        k++;  
    }  
  
    for (j=n-1; j>1; j--)  
    {  
        w=0;    // 表示进位  
        for (i=0; i<k; i++)  
        {  
            t = a[i]*j+w;  
            a[i] = t%10;  
            w = t/10;  
        }  
  
        while(w)  
        {  
            a[i++] = w%10;  
            w/=10;  
            k++;  
        }  
    }  
    //return k; 
	int s=0;  
    //printf("位数 %d 位\n",k);  
    for (s=k-1; s>=0; s--)  
    {  
        printf("%d",a[s]);  
    }
	printf("\n");  
    }
}  

  

posted @ 2019-12-15 00:20  yyer  阅读(703)  评论(0编辑  收藏  举报