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