
算法过程
标准的“下一个排列”算法可以描述为:
从后向前查找第一个相邻升序的元素对 (i,j),满足 A[i] < A[j]。此时 [j,end) 必然是降序
在 [j,end) 从后向前查找第一个满足 A[i] < A[k] 的 k。A[i]、A[k] 分别就是上文所说的“小数”、“大数”
将 A[i] 与 A[k] 交换
可以断定这时 [j,end) 必然是降序,逆置 [j,end),使其升序
如果在步骤 1 找不到符合的相邻元素对,说明当前 [begin,end) 为一个降序顺序,则直接跳到步骤 4
int cmp(const void *a, const void *b)
{
return *((int *)a) - *((int *)b);
}
void nextPermutation(int* nums, int numsSize){
if(!nums || numsSize <= 1) {
return;
}
int i = numsSize - 1;
bool flag = false;
for (; i > 0; i--) {
if (nums[i] > nums[i - 1]) {
flag = true;
break;
}
}
if (flag) {
int change = nums[i - 1];
int min_value = nums[i];
for (int j = i; j < numsSize; j++) {
if (nums[j] > change) {
min_value = nums[j] < min_value ? nums[j] : min_value;
}
}
int j = i;
for (; j < numsSize; j++) {
if (nums[j] == min_value) {
break;
}
}
//printf("%d %d %d %d\n", i, nums[i - 1], j, nums[j] );
int tmp = nums[j];
nums[j] = nums[i - 1];
nums[i - 1] = tmp;
qsort(&nums[i], numsSize - i, sizeof(int), cmp);
} else {
qsort(nums, numsSize, sizeof(int), cmp);
}
}
1293



被折叠的 条评论
为什么被折叠?



