全排列、按字典序全排序

本文探讨了如何进行全排列操作,并详细讲解了如何实现按字典序的全排列排序。通过实例展示了算法的过程,并给出了测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单纯全排列

public class FullSort {
    public static void fullSort(char[] arr, int start, int end){
        if(arr == null || arr.length == 0){
            return;
        }
        int len = arr.length;
        if(start == end){

            for(int i = 0; i < len; i++){
                System.out.print(arr[i] + " ");
            }
            System.out.println();
        }else {
            for (int i = start; i <= end; i++) {
                swap(arr, start, i);
                fullSort(arr, start + 1, end);
                swap(arr, start, i);
            }
        }
    }
    public static void swap(char[] arr, int front, int back){
        char tmp = arr[front];
        arr[front] = arr[back];
        arr[back] = tmp;
    }
    public static void main(String[] args){
        char[] arr = {'a','b','c'};
        fullSort(arr,0,arr.length);

    }
}

按字典序全排列

public class FullSort {
   /**
     * 要想实现字典序全排列,
     * 我们只要考虑一个随机序列下,如何找到下一个排列,以及什么时候停止寻找即可。
     * 比如1234876;
     * 对于这样一个序列,字典序排列的下一个排列是什么呢?
     * 应该是1236478
     * 这个过程是看尾,不看头,得看这个尾部处于降序,那么这段尾部,就没有办法再进行字典序排列了,得更新前面一个元素
     * 全排列是从后往前的过程
     * 对于1234876,最后三位已经排列完,但是后四位还没有排列完,
     */

    //先写一个函数,判断一个数组中第一个从后往前非降序数字的位置
    public static int search(int[] arr){
        int len = arr.length;
        int front = len - 2;
        while(front >= 0 && arr[front] > arr[front + 1]){
            front--;
        }
        return front;
    }
    //再写一个函数从后往前寻找第一个比某个数大的数的位置
    public static int searchBigger(int[] arr, int targetIndex){
        int len = arr.length;
        int index = len - 1;
        while(index >= 0 && arr[index] < arr[targetIndex]){
            index--;
        }
        return index;
    }

    public static void swapInt(int[] arr, int index1, int index2){
        int tmp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = tmp;
    }
    //逆序一个数组,逆序一个数组还是挺简单的,设置头尾两个指针
    public static void reverse(int[] arr, int start, int end){
        while(start < end){//这里不要写等于
            int tmp = arr[start];
            arr[start] = arr[end];
            arr[end] = tmp;
            start++;
            end--;
        }
    }

    public static void printArray(int[] arr){
        int len = arr.length;
        for(int i = 0; i < len; i++){
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }


    public static void fullSort1(int[] arr){
        if(arr == null || arr.length == 0){
            return;
        }
        printArray(arr);
        int front = search(arr);
        while(front != -1){
            int back = searchBigger(arr,front);
            swapInt(arr,front,back);
            reverse(arr,front + 1, arr.length - 1);
            printArray(arr);
            front = search(arr);
        }
    }
    public static void main(String[] args){
        int[] arr = {1,2,3,4};
        fullSort1(arr);

    }


}

测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值