窮盡所有排列 下乙個排列

2021-09-08 14:37:24 字數 4048 閱讀 9047

#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...