加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C++求数组的全排列之字典序法

发布时间:2020-12-16 07:46:22 所属栏目:百科 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 字典序法说明: 字典序列算法是一种非递归算法。而它正是STL中Next_permutation的实现算法。 它的整体思想是让排列成为可递推的数列,也就是说从前一

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

字典序法说明:
字典序列算法是一种非递归算法。而它正是STL中Next_permutation的实现算法。
它的整体思想是让排列成为可递推的数列,也就是说从前一状态的排列,可以推出一种新的状态,直到最终状态。比如说,最初状态是12345,最终状态是54321。
1.最初状态为12345,从最后面向前面比较,因为5>4,所以从4后面的序列中找出一个比4大,但是比在4后面的序列中最小的数,因为只有5,所有将4和5调换位置,结果为12354.
2.将原来4后面的序列进行倒置,因为现在只有1个4,倒置后还是12354.
3.已12354为基础,继续上面的步骤进行操作,下一序列的生成步骤如下:
12354(5>3) -> 12354(4,5序列中最小但是比3大的是4) -> 12453(调换4和3) -> 12435(将5,3倒置)
#include <stdio.h>
#include <ctype.h>
#include <malloc.h>
 
static void swapNum(int i,int j,int* intArray,int num);
static int getSmallestButGreatThanIndex(int* intArray,int num,int i);
static void invertIntArray(int i,int num);
static void prtIntArray(int* intArray,int num);
 
int main(int argc,char* argv[]){
    int num = 0;
    int* intArray = NULL;
    int i = 0;
    int j = 0;
     
    //检查参数,必须是2个
    if(argc != 2){
        printf("there must be one parameter!n");
        goto FINALLY;
    }
     
    //检查参数,参数必须是数字
    char* ptr = argv[1];
    while(*ptr != ''){
        if(isdigit(*(ptr++)) == 0){
            printf("please input a numble!n");
            goto FINALLY;
        }
    }
     
    //将参数转换成int型
    num = atoi(argv[1]);
    intArray = (int*)malloc(sizeof(int) * num);
    //初始化数组:1,2,3,4,5,6......
    for(i=0; i<num; i++){
        intArray[i] = i+1;
    }
     
    //打印下原始数组
    printIntArray(intArray,num);
    //从数组最后面往前比较
    for(i=num-1,j=num-2; i>=1 && j>=0; i--,j--){
        //如果右边数的比左边数的大
        if(intArray[i] > intArray[j]){
            //将左边的数与右边数组中最小但是比左边的数大的数交换
            swapNum(i,j,intArray,num);
            //将左边数右边的数组序列倒置
            invertIntArray(i,num);
            //将整个数组打印
            printIntArray(intArray,num);
            //继续从数组的最后面往前面比较
            i = num;
            j = num - 1;
        }
    }
     
FINALLY:
    if(intArray != NULL){
        free(intArray);
        intArray = NULL;
        }
    return 0;
}
 
static void swapNum(int i,int num){
    int swapi = getSmallestButGreatThanIndex(intArray,num,i);
    int temp = intArray[j];
    intArray[j] = intArray[swapi];
    intArray[swapi] = temp;
}
 
static int getSmallestButGreatThanIndex(int* intArray,int i){
    int m = 0;
    int swapi = 0;
    int smallest = num + 1;
    for(m = i; m<num; m++){
        if(intArray[m] > intArray[j] && intArray[m] < smallest){
            swapi = m;
            smallest = intArray[m];
        }
    }
    return swapi;
}
 
static void invertIntArray(int i,int num){
    int m;
    int n;
    int temp;
    for(m=i,n=num-1; (m-n)<0; m++,n--){
        temp = intArray[m];
        intArray[m] = intArray[n];
        intArray[n] = temp;
    }
}
 
static void printIntArray(int* intArray,int num){
    int i;
    for(i=0; i<num; i++){
        printf("%d ",intArray[i]);
    }
    printf("n");
}
 

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读