#include<
stdio.h
>
#include
<
string
.h>
#include
<
stdlib.h
>
#include
<
limits.h
>
void
swap(unsigned
char
*a, unsigned
char
*b);
/*@brief reverse an array, whose index is equal and larger than lo, and
equal and smaller then high
*/void
reverse(unsigned
char
array,
intlo,
inthigh);
/*@brief to find next arrange in ascending order, and store it in array
*/int
larger_next(unsigned
char
array,
intlo,
inthigh);
/*@brief to find next arrange in descending order, and store it in array
@return 1: found successful 0: no number smaller exists
*/int
smaller_next(unsigned
char
array,
intlo,
inthigh);
/*@brief print an array, whose index is equal and larger than lo, and
equal and smaller then high
*/void
print(unsigned
char
array,
intlo,
inthigh);
/*@brief sort an array
@param order: 1 ascending 0 descending
*/void
sort(unsigned
char
array,
intlo,
inthigh,
intorder);
#define
n 11
intmain()
;size_t cnt =0
;reverse(a,
0, n-1
);print(a,
0, n-1
);sort(a,
0, n-1
, 1);print(a,
0, n-1
);sort(a,
0, n-1
, 0);print(a,
0, n-1
);printf(
"---------------\n");
while
(smaller_next(a,
0, n-1
)) printf(
"---------------\n");
print(a,
0, n-1
);printf(
"--- %u ---\n
", cnt);
cnt=0;
while
(larger_next(a,
0, n-1
)) cnt
++;
print(a,
0, n-1
);printf(
"--- %u ---\n
", cnt);
return0;
}void
sort(unsigned
char
a, int
lo,
inthigh,
intorder)
} //descending
if(order ==0
)reverse(a, lo, high);
}void
print(unsigned
char
array,
intlo,
inthigh)
void
swap(unsigned
char
*a, unsigned
char*b)
void
reverse(unsigned
char
array,
intlo,
inthigh)
}int
smaller_next(unsigned
char
array,
intlo,
inthigh)
}
} return0;
/*int i, cur=-1, max, k;
for (i=high; i>lo; i--)
}}
swap(&(array[cur]), &(array[k]));
sort(array, cur+1, high, 0);
return 1;
*/}
/** 第一種演算法:稍微快一點
* 要尋找比長整數124653更大的排列,可從該排列的最後乙個數字順序
* 向前逐位考察,當發現排列中的某個數字比它前乙個數字大時,如本
* 例中的6比它的前一位數字4大,這說明還有對應更大整數的排列,並
* 標識前一位數字為需要調整的數字(比如這裡的4)--這裡稱為交換位。
* 然後在從這一數字開始直到最後乙個數字的系列中,我們應用如下方法:
* 把該排列的數字從最後一位開始順序作為考察位,當發現考察位大於它前面
* 的某個數字時,則把這兩個數字交換,然後對交換位後面的數字進行
* 排列。
*//*
* 第二種演算法:
* 要尋找比長整數124653更大的排列,可從該排列的最後乙個數字順序
* 向前逐位考察,當發現排列中的某個數字比它前乙個數字大時,如本
* 例中的6比它的前一位數字4大,這說明還有對應更大整數的排列。但
* 為了順序從小到大列舉出所有的排列,不能立即調整得太大,如本例
* 中將數字6與數字4交換得到的排列126453就不是排列124653的下乙個
* 排列。為了得到排列 124653的下乙個排列,應從已經考察過的那部分
* 數字中選出比數字大,但又是它們中最小的那乙個數字,比如數字5,
* 與數字4交換。該數字也是從後向前考察過程中第乙個比4大的數字。5
* 與4交換後,得到排列125643。在前面數字1,2,5固定的情況下,還應
* 選擇對應最小整數的那個排列,為此還需將後面那部分數字的排列順
* 序顛倒,如將數字6,4,3的排列順序顛倒,得到排列1,2,5,3,4,
* 6,這才是排列1,2,4,6,5,3的下乙個排列。
*/int
larger_next(unsigned
char
array,
intlo,
inthigh)}}
return0;
/*int i, cur=-1, min, k;
for (i=high; i>lo; i--)
}if (cur == -1)
return 0;
min = int_max;
//find the digit which is the smallest of the digits, that are larger than array[cur]
for (i=cur+1; i<=high; i++)
下乙個排列
給定乙個若干整數的排列,給出按正數大小進行字典序從小到大排序後的下乙個排列。如果沒有下乙個排列,則輸出字典序最小的序列。樣例 左邊是原始排列,右邊是對應的下乙個排列。1,2,3 1,3,2 3,2,1 1,2,3 1,1,5 1,5,1 思路 1 先從右到左找到第乙個不屬於非最大字典序排列的元素l,...
下乙個排列
給定乙個若干整數的排列,給出按正數大小進行字典序從小到大排序後的下乙個排列。如果沒有下乙個排列,則輸出字典序最小的序列。左邊是原始排列,右邊是對應的下乙個排列。1,2,3 1,3,2 3,2,1 1,2,3 1,1,5 1,5,1 剛開始看這個題目沒有看懂,在網上蒐集一番資料後,懂得了題目想要做的事...
下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...