1.三个数从小到大输出
#include <stdio.h>
void main(){
int a,b,c,t;
printf("enter 3 int nums:\n");
scanf("%d%d%d",&a,&b,&c);
if (a>b) {
t=a;
a=b;
b=t;
}
if (a>c) {
t=a;
a=c;
c=t;
}
if (b>c) {
t=b;
b=c;
c=t;
}
printf("排序后的序列:%d,%d,%d\n",a,b,c);
}
2.猴子吃桃问题
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将第一天剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10 天早上想再吃时,发现只剩下一个桃子了。求猴子第一天摘了多少个桃子。
#include <stdio.h>
void main(){
int d,x1,x2;
d=9;
x2=1;
while (d>0) {//d=9
x1=(x2+1)*2;//x2=x1/2-1,第一轮循环得到的x1是第九天的桃子数
x2=x1;
d--;
}
printf("第一天摘了%d个桃子\n\n",x1);
}
3.百钱买百鸡问题
鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
#include <stdio.h>
void main(){
int cock,hen,chick;//公鸡,母鸡,小鸡
for (cock=0; cock<=20; cock++) {//0≤公鸡≤20
for (hen=0; hen<=33; hen++) {//0≤母鸡≤33
for (chick=3; chick<=99; chick++) {//3≤小鸡≤99,不能大于99是因为要买百鸡,而且必须是3的倍数
if (5*cock+3*hen+chick/3==100) {//百钱
if (cock+hen+chick==100) {//百鸡
if (chick%3==0) {//小鸡是3的倍数
printf("公鸡:%d,母鸡:%d,小鸡:%d\n",cock,hen,chick);
}
}
}
}
}
}
}
4.渔夫打渔晒网问题
如果一个渔夫从 2011 年 1 月 1 日开始每三天打一次渔,两天晒一次网,编程实现当输入 2011 1 月 1日以后的任意一天,输出该渔夫是在打渔还是在晒网。
#include <stdio.h>
int leap(int a){
if (a%4==0&&a%100!=0||a%400==0) {//判断闰年
return 1;//是闰年
}
else
return 0;//不是闰年
}
int number(int year,int month,int day){
int sum=0,i,j,k;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年
int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};//闰年
if (leap(year)==1) {//闰年
for (i=0; i<month-1; i++) {
sum+=b[i];
}
}
else{//不是闰年
for (i=0; i<month-1; i++) {
sum+=a[i];
}
}
for (j=2011; j<year; j++) {
if (leap(j)==1) {//闰年366
sum+=366;
}
else//平年365
sum+=365;
}
sum+=day;
return sum;
}
void main(){
int year,month,day,n;
printf("输入年月日:\n");
scanf("%d%d%d",&year,&month,&day);
n=number(year, month, day);
if ((n%5)<4&&(n%5>0)) {//余数是1或2或3时说明在打渔,否则在晒网
printf("%d:%d:%d\t打渔\n",year,month,day);
}
else
printf("%d:%d:%d\t晒网\n",year,month,day);
}
5.希尔排序算法
希尔排序的思想是使数组中任意间隔为h的元素都是有序的。这样的数组被称为h有序数组。
说一下插入排序,有前插和后插之分,前插法是把第一个元素当作一个有序数列,然后依次扫描后面的元素,插入到前面的有序数列之中。
记录按下标的一定增量分组,对每一组进行插入排序,增量逐渐减少,最后增量减少至1,整个数组被分成一组,得到排列好的数组。
一开始,我们选择增量gap=length/2,然后缩小增量gap=gap/2…这里的增量序列是希尔建议的增量,但这个增量序列并不是最优的。
希尔排序的时间复杂度为O(n*logn);
#include <stdio.h>
void shell_sort(int a[],int length){
int i,j,k;
int gap;//分组步长
int temp;//哨兵
for (gap=length/2; gap>0; gap=gap/2) {
for (i=0; i<gap; i++) {
for (j=i+gap; j<length; j=j+gap) {
if (a[j]<a[j-gap]) {
temp=a[j];
k=j-gap;
while (k>=0&&a[k]>temp) {
a[k+gap]=a[k];
k=k-gap;
}
a[k+gap]=temp;
}
}
}
}
}
void main(){
int a[10]={49,38,65,97,76,13,27,49,55,4},i;
shell_sort(a, sizeof(a)/sizeof(int));
printf("排序后的序列:\n");
for (i=0; i<10; i++) {
printf("%4d",a[i]);
}
printf("\n");
}
**
6.冒泡排序
**
每一轮比较得出一个最大的数放在末尾。
#include <stdio.h>
void main(){
int a[]={9,8,7,6,2,3,5,0,1};
int n;
int i;
int j;
int t;
n=sizeof(a)/sizeof(a[0]);
for (i=0; i<n-1; i++) {//外层循环控制循环n-1轮
for (j=0; j<n-1-i; j++) {//每轮比较n-1-i次
if (a[j]>a[j+1]) {
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for (i=0; i<n; i++) {
printf("%4d",a[i]);
}
printf("\n");
}
**
7.直接插入排序算法
**
插入排序:把一个记录插入到已排序的有序序列中,使整个序列在插入该记录后仍然有序。
直接插入排序:将待插入的记录与有序区中的各记录自右向左依次比较其关键字的大小。
#include <stdio.h>
void sort(int s[],int n){
int i,j;
for (i=2; i<=n; i++) {
s[0]=s[i];
j=i-1;
while (s[0]<s[j]) {
s[j+1]=s[j];
j--;
}
s[j+1]=s[0];
}
}
void main(){
int a[11],i;
printf("enter 10 nums:\n");
for (i=1; i<=10; i++) {
scanf("%d",&a[i]);
}
sort(a, 10);
printf("sorted nums:\n");
for (i=1; i<=10; i++) {
printf("%4d",a[i]);
}
printf("\n");
}
**
8.快速排序算法
**
1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最好的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;
2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;
3.对左右两个分区重复以上步骤直到所有元素都是有序的。
#include <stdio.h>
void qusort(int s[],int start,int end) //自定义函数 qusort()
{
int i,j; //定义变量为基本整型
i=start; //将每组首个元素赋给i
j = end; //将每组末尾元素赋给j
s[0]=s[start]; //设置基准值
while(i<j)//直到让基准值左边的都比他小,右边的都比他大
{
while(i<j&&s[0]<s[j]){
j--; //位置左移,一直找,直到遇到比s[0]小(或者相等)的数
}
//遇到比s[0]小(或者相等d)的数
if(i<j)
{
s[i]=s[j]; //将s[j]放到s[i]的位置上
i++; //位置右移
}
while(i<j&&s[i]<=s[0])
i++; //位置左移
if(i<j)
{
s[j]=s[i]; //将大于基准值的s[j]放到s[i]位置
j--; //位置左移
}
}
s[i]=s[0]; //将基准值放入指定位置,是i还是j都可以,因为这时i=j
if (start<i)
qusort(s,start,i-1); //对分割出的部分递归调用qusort()函数
if (i<end)
qusort(s,i+1,end);
}
void main()
{
int a[11], i; //定义数组及变量为基本整型
printf("请输入10个数:\n");
for(i=1;i<=10;i++)
scanf("%d",&a[i]); //从键盘中输入10个要进行排序的数
qusort(a,1,10); //调用qusort()函数进行排序
printf("排序后的顺序是:\n");
for(i=1;i<=10;i++)
printf("%5d",a[i]); //输出排好序的数组
printf("\n");
}
**
9.选择排序法
**
在每一次的排序中选出最小(或最大)的数,将其放在数组最前端,然后在后面的数中重复此步骤,最终达到排序的目的.
#include <stdio.h>
void main(){
int i,j,t,a[11];
printf("enter 10 nums:\n");
for (i=1; i<11; i++) {
scanf("%d",&a[i]);
}
for (i=1; i<=9; i++) {
for (j=i+1; j<=10; j++) {
if (a[i]>a[j]) {//把a[i]跟每个a[j]比
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
for (i=1; i<11; i++) {
printf("%4d",a[i]);
}
printf("\n");
}