思路
1、倒着遍历数组,寻找到一个nums[i]>nums[i-1]停止
2、从i位置到数组结束,找到最小的比nums[i-1]大的元素,和nums[i-1]进行交换
3、从i位置到数组结束进行排序
4、如果不存在nums[i]>nums[i-1],则对数组整个进行排序
代码
public void nextPermutation(int[] nums) {
int flag=0;
for(int i=nums.length-1;i>0;i--){
if(nums[i]>nums[i-1]){
flag=1;
int min=i;//最小的比num[i-1]大的下标
for(int j=i+1;j<nums.length;j++){
if(nums[j]>nums[i-1] && nums[j]<nums[i]){
min=j;
}
}
//交换min和i-1下标的元素
swap(min,i-1,nums);
//从下标i开始排序
sort(i,nums);
break;
}
}
//没有找到nums[i]>nums[i-1]
if(flag==0){
//整个进行排序
sort(0,nums);
}
}
private void sort(int i, int[] nums) {
//使用冒泡排序
for(int j=i;j<nums.length-1;j++){
//因为i不一定是从0开始,所以每次要+i
for(int k=i;k<nums.length-1-j+i;k++){
if(nums[k]>nums[k+1]){
swap(k,k+1,nums);
}
}
}
}
private void swap(int a, int b, int[] nums) {
int temp=nums[b];
nums[b]=nums[a];
nums[a]=temp;
}