題目:
下一個排序題目: // 将輸入數字倒序
void reversenums(int* nums, int numsSize){
int i = 0;
int iTmp = 0;
if ((NULL == nums) || (0 == numsSize))
{
return nums;
}
for (i = 0; i < (numsSize / 2); i++)
{
iTmp = nums[i];
nums[i] = nums[numsSize - i - 1];
nums[numsSize - i - 1] = iTmp;
}
return;
}
//思路:
//從後往前周遊,建立一個滑窗,滑窗從頭到尾為降序,頭指向第一個破壞降序的數字,尾部指向後面比該數字大的數字
//數字交換
void nextPermutation(int* nums, int numsSize){
int i = 0;
int j = 0;
int iTmp = 0;
int iTail = 0; //滑窗尾巴
int iHead = 0; //滑窗頭部
if ((NULL == nums) || (0 == numsSize) || (1 == numsSize))
{
return nums;
}
iTail = numsSize - 1;
iHead = numsSize - 1;
//1, 定位滑窗,head 指向第一個小于 head + 1的位置
for (i = numsSize - 1; i > 0; i--)
{
if (nums[i - 1] < nums[i])
{
// 定位滑窗頭的位置
iHead = i - 1;
// 定位滑窗尾的位置
for (j = iTail; j > iHead; j--)
{
if (nums[i - 1] >= nums[j])
{
iTail -= 1;
}
}
break;
}
}
// printf("[1] head=%d, tail=%d\n", iHead, iTail);
if (iHead != iTail)
{
//2, 交換數字位置,
//1) 将head 至 Tail 之間的數字倒序
//2) 将Tail 至 numsSize 之間的數字倒序
//3) 将Tail 至 numsSize 之間的數字插入到 head 前
reversenums(&nums[iHead + 1], iTail - iHead - 1);
reversenums(&nums[iTail + 1], numsSize - iTail - 1);
// for (i = 0; i < numsSize; i++)
// {
// printf("%d ", nums[i]);
// }
// printf("\n");
for (i = numsSize - 1; i >= iTail; i--)
{
iTmp = nums[numsSize - 1];
// memmove(&nums[iHead + 1], &nums[iHead], sizeof(int) * (numsSize - iHead - 1));
for (j = numsSize - 1; j > iHead; j--)
{
nums[j] = nums[j - 1];
}
nums[iHead] = iTmp;
}
}
else
{
//3, 特殊情況,數字為倒序,不存在更大的排列
reversenums(nums, numsSize);
}
return nums;
}
下一個排序題目: