求数组的全排列之字典序法
来源:互联网 发布:macbook用什么编程 编辑:程序博客网 时间:2024/05/17 01:32
字典序法说明:
字典序列算法是一种非递归算法。而它正是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倒置)
。。。。。。
C代码如下:
#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 j, int i);static void invertIntArray(int i, int* intArray, 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 != '\0'){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, intArray, 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 j, int* intArray, int num){int swapi = getSmallestButGreatThanIndex(intArray, num, j, i);int temp = intArray[j];intArray[j] = intArray[swapi];intArray[swapi] = temp;}static int getSmallestButGreatThanIndex(int* intArray, int num, int j, 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* intArray, 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");}
- 求数组的全排列之字典序法
- 求字典序的下一个全排列
- c++之全排列字典序法
- 全排列算法之字典序法
- 全排列之字典序法
- 求数组的全排列
- 求数组的全排列
- 按字典序输出数组内元素的全排列
- 按字典序输出数组的全排列
- 全排列算法的字典序排列
- 模拟之全排列的第k个字典序
- 求数组的全部子集 && 全排列
- 转载整理:求数组的全排列
- 求一个数组的全排列算法
- 求字符数组的全排列算法
- 求字符数组的全排列
- 求一个数组的全排列
- STL之字典序全排列
- 同时将NAND FLASH和SD卡作为MASS STORAGE连接到PC机上
- CH05C#面向对象编程概念
- ACM相关资源
- 串口通讯据处理算法
- Winrar4.11免费破解版(破解方法/激活码)
- 求数组的全排列之字典序法
- 从前往后说 学生信息管理系统
- zoj2417
- 读取网络抓包文件data得到参数
- Android 利用AlertDialog 实现评分机制
- java String和Date转换
- 封装read和write函数
- 控制字符
- AOP编程思想