| 
注册时间2009-1-23
阅读权限10
最后登录1970-1-1UID57950 周游历练 
 
 该用户从未签到 | 
 
| 忙活了半下午,算是写出来了,细节方面完全搞懂了才写。 #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];
 当输入数字数量不同时,倒着写的开端是不一样的,所以需要分情况。
 | 
 |