求数组的全排列

给定一个数组,求出全排列的情形?

算法描述:

/**

— 给定数组 3 4 6 9 8 7 5 2 1

如何求出紧挨着的下一个排列?

step1:从后面扫描,找到第一个下降的数(6),并记录;

step2:依然从后面扫描,找到第一个大于step1(6)的数7,并记录;

step3:交换step1(6)、step2(7);=》3 4 7 9 8 6 5 2 1

step4:在step(7)之后的数字,首尾互换 =》3 4 7 1 2 5 6 8 9即为所求

*/

static int count = 0;//计数

void swap(int a[],int i,int j)
{
    a[i] ^= a[j];
    a[j] ^= a[i];
    a[i] ^= a[j];
}

/**
    前提条件是i<j 这里为了实现 不做判断
*/
void reserve(int a[],int i,int j)
{
    for(;i<j;i++,j--)
    {
        swap(a,i,j);
    }
}

void print(int a[],int n)
{
    count++;
    for(int i=0;i<n;i++)
    {
        cout << a[i];
    }
    cout << endl;
}
void A_m(int a[],int len)
{
    if(len < 2)
        return;
    while(true)
    {
        print(a,len);
        int i,j;
        for(i=len-2;i>=0;i--)
        {
            if(a[i] < a[i+1])
                break;
            else if(i == 0)
                return;
        }
        for(j=len-1;j>i;j--)
        {
            if(a[j] > a[i])
                break;
        }
        swap(a,i,j);
        reserve(a,i+1,len-1);
    }
}
int main()
{
    int a[4] = {1,2,3,4};
    A_m(a,4);
    cout << count << endl;
    return 0;
}
时间: 2024-10-18 22:53:45

求数组的全排列的相关文章

求数组排列的范围

问题描述:给定一个整数数组,将这个整数数组排列成一个整数,并且数组的每个元素都要用到,求所排列出的整数的范围. 分析:这是一个很有意思的题目,初看好像是要求所有排列情况的最小值和最大值,当然这样做也可以求出来,只不过时间复杂度过高, 另外还有一个问题是大数问题,所排列成的数可能范围很大,超过了基本数据类型所能表示的范围,因此需要转换为字符串处理. 下面详细介绍解法: 解法一:用排列法.也就是求出这个数组的全排列,然后求出这个排列的最小值和最大值.由于排列要用到递归实现, 递归一般消耗系统大量的时

数组的全排列

1.问题背景 学过数学的人都知道,全排列的意思是什么.现在如何用计算机的编程语言实现数组的全排列呢? 数组的全排列可用于求解八皇后问题,具体参见:全排列解决八皇后问题.与此同时,全排列经常会出现在笔试或者面试,如求字符串的全排列.之所以那它作为考题,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平.所以,掌握它很重要. 2.全排列的递归实现 2.1求解思路 全排列表示把集合中元素的所有按照一定的顺序排列起来,使用P(n, n) = n!表示n个元素全排列的个数

写一个方法求数组中的最大值,最小值,总和以及平均值。

class Program { /// <summary> /// 求数组中的最大值,最小值,总和以及平均值. /// </summary> /// <param name="nums">输入一个数组</param> /// <returns>返回一个新的数组(max,min,sum,avg)</returns> public static int[] GetMaxMinSumAvg(int[] nums) { i

class 3 求数组中的最大值(单元测试)

1.问题引出: int Largest(int list[], int length) { int i,max; for(i = 0; i < (length – 1); i ++ ) { if(list[i] > max) { max=list[i]; } } return max; } 由此段程序编写一个正确的程序实现求数组的最大值. #include <iostream> using namespace std; int Largest(int list[],int leng

[LeetCode] Find Peak Element 求数组的峰值

A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ num[i+1], find a peak element and return its index. The array may contain multiple peaks, in that case return the index to any one of the peaks is fi

《github一天一道算法题》:分治法求数组最大连续子序列和

看书.思考.写代码! /*************************************** * [email protected] * blog: http://blog.csdn.net/hustyangju * 题目:分治法求数组最大连续子序列和 * 思路:分解成子问题+合并答案 * 时间复杂度:O(n lgn) * 空间复杂度:O(1) ***************************************/ #include <iostream> using nam

算法题:求数组中最小的k个数

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 题目:输入n个整数,找出其中最小的k个数. <剑指offer>给出了两种实现算法: 算法1:采用Partition+递归法,该算法可以说是快速排序和二分查找的有机结合.算法的时间复杂度为O(n),缺点在于在修改Partition的过程中会修改原数组的值. 算法2:采用top-k算法.如果要找最小的K个数,我们才用一个含有K个值的大顶堆:如果要找最大的K个数,我们采用小顶堆.该算法的时间复杂度为O(nlogK),是一种比较好的算法,启发于堆排序

1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式

 1.打印二进制机器码(分别表示32位的和64位的) #include <stdio.h> /*按照8位的长度打印一个数值*/ void dis8bit(char val) { int bit = 8; while(bit--) { if(1<<bit&val){ printf("1"); } else { printf("0"); } if(!(bit%4)) printf(" "); } putchar(1

用C随机产生的正整数存到数组中,并求数组中的所有元素最大值、最小值、平均值以及各元素之和,及第二大值。

用 C 求一组随机数的第二大值,不能通过对整体排序求得 1 随机产生20个[10 , 50]的正整数存到数组中,并求数组中的所有元素最大值.最小值.平均值以及各元素之和,及第二大值.        int a[20];    int sum = 0; //存储数组元素的和    //为数组赋值    printf("数组中的元素为:\n ");    for (int i = 0; i < 20; i ++) {        a[i] = arc4random() % 41 +