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"); } }
天晴了,起飞吧