您的位置:首页 > 其它

习题2.8 输出全排列(20 分)

2018-01-03 11:03 417 查看


习题2.8 输出全排列(20 分)

请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。


输入格式:

输入给出正整数n(<10)。


输出格式:

输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a​1​​,a​2​​,⋯,a​n​​排在序列b​1​​,b​2​​,⋯,b​n​​之前,如果存在k使得a​1​​=b​1​​,⋯,a​k​​=b​k​​ 并且 a​k+1​​<b​k+1​​。


输入样例:

3


输出样例:

123132
213231
312
321


#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;

void quicksort( ElementType A[], int l, int r);
void swapElement(ElementType *a, ElementType *b);
void dictPrem(ElementType ary[], int len);
void showarray(ElementType a[], int len);

void swapElement(ElementType *a, ElementType *b)
{
ElementType temp = 0;
temp = *a;
*a = *b;
*b = temp;

}
void quicksort( ElementType A[], int l, int r)
{
ElementType tmp;
int i, j;

if(l < r)
{
i = l;
j = r;
tmp = A[i];
while(i < j)
{
while(A[j]>tmp && i<j) //一定要i<j,因为下面j--改变了j的值,没有这个判定,无法跳过A[j]大于tmp不用改变j值的情况
j--;               //由右往左寻找,遇到A[j]>tmp则跳过,寻找下一个
if(i<j)
{
A[i] = A[j];
i++;
}
while(A[i]<tmp && i<j) //改变这里的A[i]<tmp小于的符号,同时改变42行A[j]>tmp的大于符号,可以改为由大到小排列
i++;
if(i<j)
{
A[j] = A[i];
j--;
}
//showarray(A, r+1);
//printf("\n***************************\n");
}
/**< 如果r == l,下面的语句不会执行,这也是迭代停止的条件 */
A[i] = tmp;
quicksort(A, l, i-1);
quicksort(A, i+1, r);
}
}

void showarray(ElementType a[], int len)
{
int j;
for(j=0; j<len; j++)
{
printf("%d ", a[j]);
}
printf("\n");
}

void dictPrem(ElementType ary[], int len)
{
int cnt, i, j, a, b;
for(i=1, cnt=1; i<=len; i++)
{
cnt *= i;
}
while(cnt--)
{
showarray( ary, len);
for(i=len-1; i>0; i--)
{
if(ary[i-1]<ary[i])
{
a = i-1;
//printf("a=%d\t", a);
break;
}
}
for(i=len-1; i>a; i--)
{
if(ary[i]>ary[a])
{
b = i;
//printf("b=%d\n", b);
break;
}
}
swapElement(&ary[a], &ary[b]);
quicksort(ary, a+1, len-1);
}
}

int main()
{
int n, i;
scanf("%d", &n);
ElementType list
;
for(i=0; i<n; i++)
{
list[i] = i+1;
}
dictPrem(list, n);
system("pause");
}


提交时间状态分数题目编译器耗时用户
2018/1/3 11:05:10答案正确20习题2.8C (gcc)549 msRoy
测试点提示结果耗时内存
01答案正确2 ms224KB
12答案正确2 ms256KB
23答案正确2 ms136KB
34答案正确2 ms228KB
45答案正确2 ms128KB
56答案正确3 ms256KB
67答案正确8 ms360KB
78答案正确57 ms620KB
89答案正确549 ms3876KB
不知道是状态不好,还是怎样,这题做了差不多1天,那个全排列至今没有弄懂。字典排序相对容易理解,可以看这篇博客字典序算法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: