飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4229|回复: 0

[C/C++] 19课作业

[复制链接]

该用户从未签到

发表于 2011-1-17 16:32:27 | 显示全部楼层 |阅读模式
忙活了半下午,算是写出来了,细节方面完全搞懂了才写。
#include <stdio.h>
#include <stdlib.h>
#define N 10                                  /*定义输入数量*/

void Input(int *p,int n);                     /*数字输入*/
void Paixu(int *p,int n,char *str);           /*排序函数*/
int mystrcmp(char *strS,char *strD,int n);    /*比较排序时命令*/
void ltos(int *p,int n);                      /*大到小*/
void stol(int *p,int n);                      /*小到大*/
void luan(int *p,int n);                      /*乱序*/
void myShowNum(int *p,int n);                 /*显示数字*/

main ()
{
   int *p=(int *)malloc(sizeof(int)*N);       /*申请空间*/
   printf("Please input num:");
   Input(p,N);
   Paixu(p,N,"ltos");
   myShowNum(p,N);
   Paixu(p,N,"stol");
   myShowNum(p,N);
   Paixu(p,N,"luan");
   myShowNum(p,N);
   free(p);                                   /*释放空间,切记!*/
   return 0;
}

void Input(int *p,int n)
{
   int i;
   for (i=0;i<n;i++)
   {
      scanf("%d",p+i);
   }
}

void Paixu(int *p,int n,char *str)            /*总排序函数,依命令调用子函数*/
{
   char str1[]="ltos";
   char str2[]="stol";
   char str3[]="luan";
   if(mystrcmp(str,str1,4))
      ltos(p,n);
   else if(mystrcmp(str,str2,4))
      stol(p,n);
   else if(mystrcmp(str,str3,4))
      luan(p,n);
}

int mystrcmp(char *strS,char *strD,int n)
{
   int i;
   for(i=0;i<n;i++)
   {
      if(strS[i]!=strD[i])
             return 0;
   }
   return 1;
}

void ltos(int *p,int n)                       /*此处利用递归排序*/
{
   int i;
   int temp;
   for(i=0;i<n-1;i++)
   {
      if(p[i]<p[i+1])
          {
             temp=p[i+1];
                 p[i+1]=p[i];
                 p[i]=temp;
          }
   }
   if(n>0)
      ltos(p,n-1);
}

void stol(int *p,int n)                       /*原理同上*/
{
   int i;
   int temp;
   for(i=0;i<n-1;i++)
   {
      if(p[i]>p[i+1])
          {
             temp=p[i+1];
                 p[i+1]=p[i];
                 p[i]=temp;
          }
   }
   if(n>0)
      stol(p,n-1);
}

void luan(int *p,int n)                       /*ori:1 2 3 4 5*/
{                                             /*        |   */
   int i;                                     /*num:1 @ 2 @ 3 @ 4 @ 5 @ (@表示空白)*/
   int j;                                     /*ori:5 4 3 2 1*/
   int num[N*2];                              /*         |   */
   stol(p,n);                                 /*num:1 5 2 4 3 3 4 2 5 1*/
   for(i=0,j=0;i<2*n;i+=2,j++)                /*截取n位传入ori*/
           num[i]=p[j];                           /*ori:1 5 2 4 3*/
   ltos(p,n);
   for(i=1,j=0;i<2*n;i+=2,j++)
           num[i]=p[j];
   for(i=0;i<n;i++)
           p[i]=num[i];
}

void myShowNum(int *p,int n)
{
   int i;
   for(i=0;i<n;i++)
      printf("%d ",p[i]);
   printf("\n");
}

正在看一本c语言的书,恰好讲了点递归的东西,所以此处排借鉴了递归的思想。
乱序排序还有一种思路就是把数字从小到大排好后复制一份,再从前间隔一位复制回来,到头后再倒着往回写。。。可能没表达清楚,看代码吧

void luan(int *p,int n)
{
   int i;
   int j;
   int num[N];
   stol(p,n);
   for(i=0;i<n;i++)
           num[i]=p[i];
   for(i=0,j=0;i<n;i+=2,j++)
       p[i]=num[j];
   for(i= (n%2) ? n-2:n-1;i>0;i-=2,j++)
       p[i]=num[j];
}
注意最后一句
for(i= (n%2) ? n-2:n-1;i>0;i-=2,j++)
       p[i]=num[j];
当输入数字数量不同时,倒着写的开端是不一样的,所以需要分情况。
PYG19周年生日快乐!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表