| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2660 人关注过本帖
标题:1、定义一个数组,编程打印它的全排列。(应用递归)2.删除文件函数
只看楼主 加入收藏
kelas
Rank: 6Rank: 6
等 级:侠之大者
帖 子:176
专家分:434
注 册:2010-5-28
结帖率:94.12%
收藏
已结贴  问题点数:20 回复次数:10 
1、定义一个数组,编程打印它的全排列。(应用递归)2.删除文件函数
1、例如:
#define N 3
int a[N] = { 1, 2, 3 };
输出结果:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
2、编写一个程序,程序功能如 rm –rf,(linux下的c)

[ 本帖最后由 kelas 于 2010-7-18 22:13 编辑 ]
搜索更多相关主题的帖子: 函数 递归 定义 排列 文件 
2010-07-18 21:23
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:3 
c语言中排序的实现方法有好几种.可以到百渡上去搜,会有不少答案的.给你提供几个.希望对你有帮助.
 
这是冒泡法的程序:
#include<stdio.h>
void sort(int array[],int size)
{
int i,j,temp;
/*下面是利用相邻的比较,把大的数放到上面;*/
for(i=0;i<size-1;i++)
        for(j=i+1;j<size;j++)
               if(array[i]>array[j])
               {
                      temp=array[i];
                      array[i]=array[j];
                      array[j]=temp;
               }
}
void main()
{
int i;
int a[10]={1,33,78,34,787,213,132,35,32,21};
sort(a,10);
for(i=0;i<10;i++)
        printf("%6d",a[i]);
}

这是选择法的程序:
#include<stdio.h>
void sort(int array[],int size)
{
int i,j,k,temp;
for(i=0;i<size-1;i++)
{
        k=i;
/*把最小的那一个数找出来,并且用a[k]记下来,然后与a[i]交换;*/
        for(j=i+1;j<size;j++)
               if(array[k]>array[j])
                      k=j;
        temp=array[k];
        array[k]=array[i];
        array[i]=temp;
}
}
void main()
{
int a[]={12,43,54,23,32,65,87,2,34,54};
int i;
sort(a,10);
for(i=0;i<10;i++)
        printf("%d ",a[i]);
}
这是一个快速排序的程序:
#include<stdio.h>
void quick_sort(int array[],int first,int last)//first,last分别为数组下标的范围;
{
int temp,low,high,list_separator;
low=first;
high=last;
/*下面是比较数组中的大小,把数组中的数与中间数比较,大的放在后半部分,比中间数小的放在前半部分,*/
    list_separator=array[(first+last)/2];//中间数;
do{
        while(array[low]<list_separator)//中间数与前半部分比较;
               low++;
        while(array[high]>list_separator)// 中间数与后半部分比较;
               high--;
        if(low<=high)//前半部分与后半部分交换;
        {
               temp=array[low];
               array[low++]=array[high];
               array[high--]=temp;
        }
}while(low<=high);
if(first<high)
        quick_sort(array,first,high);//利用递归的办法,实行循环;
if(low<last)
        quick_sort(array,low,last);//利用递归的办法,实行循环;
}
void main()
{
int a[9]={12,23,34,65,93,32,21,9,8};
quick_sort(a,0,8);
for(int i=0;i<9;i++)
        printf("%d ",a[i]);
printf(" ");
}
这是一个希尔排序的程序:
#include<stdio.h>
void shell_sort(int array[],int size)
{
int temp,gap,i,flag;
gap=size/2;
do{
        do{
               flag=0;/*利用标记,使前半部分与后半部分的数都对应比较过,前半部分大于后半部分的交换,直到都比较过,并且前半部分的数小于与前部分一一对应的后部分的数时,退出while循环*/
               for(i=0;i<size-gap;i++)
                      if(array[i]>array[i+gap])
                      {
                             temp=array[i];
                             array[i]=array[i+gap];
                             array[i+gap]=temp;
                          flag=1;
                      }
        }while(flag);
}while(gap=gap/2);
}
void main()
{
int array[]={1,2,32,43,64,7654,321,42,23,97,56,32,78,45,32},i;
shell_sort(array,15);
for(i=0;i<15;i++)
        printf("%10d",array[i]);
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-19 11:29
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
无语。。。

人家是说的排列组合。 不是排序。。。。

排列最经典的算法是回溯剪枝递归。

诶。。..

[ 本帖最后由 Devil_W 于 2010-7-19 12:58 编辑 ]
2010-07-19 12:56
kelas
Rank: 6Rank: 6
等 级:侠之大者
帖 子:176
专家分:434
注 册:2010-5-28
收藏
得分:0 
回复 3楼 Devil_W

求解。。。
2010-07-19 22:22
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:12 
程序代码:
#include<stdio.h>
#define N 3
int a[N] = { 1, 2, 3 }; 
int buf[N]={ 0 };
int ok(int k)
{
    int i;
    for( i = 0 ; i < k ; i++ )
    {
    if ( buf[i] == buf[k] )
        return 0;
    }
    return 1;
}

void func( int n )
{
    int i;
    if ( n == N )
    {

    for( i = 0 ; i < N ; i++ )
        printf("%d ",buf[i]);
    printf("\n");
    }
    else
    {
    for( i =0 ; i < N ; i++ )
    {
        buf[n] = a[i];
        if( ok(n) )
        func(n+1);
    }
    }
    
}
int main()
{
    func(0);
    return 0;
}
2010-07-19 22:30
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
汗,写错了

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-20 09:31
kelas
Rank: 6Rank: 6
等 级:侠之大者
帖 子:176
专家分:434
注 册:2010-5-28
收藏
得分:0 
回复 5楼 Devil_W
恩 谢谢呵 可不可以解释一下 对递归越来越模糊了...
2010-07-20 15:40
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:3 
要想递归,就得想出某种能递归的状态。比如你要排列 1,2,3
那么的排列只有三类,分别用 1,2,3开头。
当你固定了一数打头之后,剩下的是用剩下的数再往后排列。所以隐约有“如果 n-1 个数会排的话,那么 n 个数的可以循环 n 次,每次选一个数放在第一位,再把 n-1 个数的全排列放到后面“ 的感觉。沿着这个思路就可以写出递归的函数。

其实stl里有一个算法 next_permutation,它可以变换一个数组,使得生成以字典序排序的排列(说得这么扭)。举例就是
abc
acb
bac
bca
cab
cba
这样的。换成数也一样,反正是比acsii码。也可以自己提供一个排序函数。
那个算法挺有意思的,有兴趣可以研究一下~
2010-07-20 17:33
kelas
Rank: 6Rank: 6
等 级:侠之大者
帖 子:176
专家分:434
注 册:2010-5-28
收藏
得分:0 
回复 8楼 pangding
谢谢指点、我会努力的,,,
2010-07-20 22:46
kelas
Rank: 6Rank: 6
等 级:侠之大者
帖 子:176
专家分:434
注 册:2010-5-28
收藏
得分:0 
恩。还有一个:
编写一个程序,程序功能如 rm –rf,(linux下的c)
2010-07-21 10:29
快速回复:1、定义一个数组,编程打印它的全排列。(应用递归)2.删除文件函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018495 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved