直接插入排序:
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 位
",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("
");
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
");
else if(n==0)
{
printf("1
");
}
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 位
",k);
for (s=k-1; s>=0; s--)
{
printf("%d",a[s]);
}
printf("
");
}
}