java全排列,java全排列遞歸演算法

本文目錄一覽:

java怎麼搞全排列

盡量用遞歸好理解一些,打個斷點

public class Permutation {

public static void permulation(int[] list, int start, int length) {

int i;

if (start == length) {

for (i = 0; i length; i++)

System.out.print(list[i] + ” “);

System.out.println();

} else {

for (i = start; i length; i++) {

swap(list, start, i);

permulation(list, start + 1, length);

swap(list, start, i);

}

}

}

public static void swap(int[] list, int start, int i) {

int temp;

temp = list;

list = list[i];

list[i] = temp;

}

public static void main(String[] args) {

int length = 3;

int start = 0;

int list[] = new int[length];

for (int j = 0; j length; j++)

list[j] = j + 1;

permulation(list, start, length);

}

}

java全排列遞歸演算法

思路:先有一個起始排列,如1234.從後面掃描,直到找到a[k],a[k]a[k+1];再從後面掃描,直到找到a[j],這裡有 a[k]a[j]。交換a[k],a[j].再把a[k+1],…a[n-1]排序(從小到大),即得到了一個排列,再循環下去,直到找出所有的排序。用C語言的,參考下:

java中,用遞歸方法求n個數的無重複全排列,n=3。

程序如下所示,輸入格式為:

5

3 1 2 1 2

第一行是數字個數,第二行有n個數,表示待排列的數,輸入假設待排序的數均為非負數。

import java.io.File;

import java.io.FileNotFoundException;

import java.util.Arrays;

import java.util.Scanner;

public class Main {

    static final int maxn = 1000;

    int n;            // 數組元素個數

    int[] a;        // 數組

    

    boolean[] used;    // 遞歸過程中用到的輔助變數,used[i]表示第i個元素是否已使用

    int[] cur;        // 保存當前的排列數

    

    // 遞歸列印無重複全排列,當前列印到第idx位

    void print_comb(int idx) {

        if(idx == n) {    // idx == n時,表示可以將cur輸出

            for(int i = 0; i  n; ++i) {

                if(i  0) System.out.print(” “);

                System.out.print(cur[i]);

            }

            System.out.println();

        }

        

        int last = -1;                            // 因為要求無重複,所以last表示上一次搜索的值

        for(int i = 0; i  n; ++i) {

            if(used[i]) continue;

            

            if(last == -1 || a[i] != last) {    // 不重複且未使用才遞歸下去

                last = a[i];

                cur[idx] = a[i];

                

                // 回溯法

                used[i] = true;

                print_comb(idx + 1);

                used[i] = false;

            }

        }

    }

    

    public void go() throws FileNotFoundException

    {

        Scanner in = new Scanner(new File(“data.in”));

        // 讀取數據並排序

        n = in.nextInt();

        a = new int[n];

        for(int i = 0; i  n; ++i) a[i] = in.nextInt();

        Arrays.sort(a);

        

        // 初始化輔助變數並開始無重複全排列

        cur = new int[n];

        used = new boolean[n];

        for(int i = 0; i  n; ++i) used[i] = false;

        print_comb(0);

        in.close();

    }

    

    public static void main(String[] args) throws FileNotFoundException{

        new Main().go();

    }

}

客觀來說,非遞歸的無重複全排列比較簡單且高效。

java實現全排列的問題

對 深度優先搜索 先交換 然後遞歸 再交換回來繼續循環下一種情況

如何用java輸出一個數組的全排列?不能用遞歸,用遞歸的話,很快就內存溢出了!

我覺得吧,你輸出一個全排列用不了多少內存,怎麼就能溢出呢?

首先,遞歸費不了多少內存,應該可以完成任務。

其次,你遞歸都幹了些什麼?別告訴我每層遞歸把數組複製一遍,你把位置遞歸一下就可以了。

如果不喜歡遞歸,可以自己弄個棧,其實差不多,速度略快,空間略小。

如果還是不明白,把全部源碼貼出來看看。

Java數組的全排列,裡面布爾類型的數組vis[ ],在遞歸演算法里起了什麼作用,遞歸那塊理解不了,求詳細解答

不要急於看代碼,你心理要知道全排列的思路,不注重思路是很多程序員易犯的錯誤。

全排列演算法:

如果我求得固定第一位後的排列,那麼全部排列就可以求出,固定第一位有10種可能,可以循環求得。

如果我求得固定第二位後的排列,固定第一位後的排列就可以求出,固定第二位有9種可能,可以循環求得。

。。。

如果我求得固定第10位後的排列,固定第9位後的排列就可以求出,固定第10位有1種可能,可以循環求得。

這很明顯是遞歸的演算法。

static void dfs(int start,int end,int num){//為全部排列的集合,start為數字的位置,end為最後一位,num多餘的

if(start==end){//當前的數字位置為最後一位時,說明,一個序列已經生成

for(int i=1;iend;i++)

System.out.print(a[i]+” “);//輸出序列

System.out.println();

}

else{//序列沒有生成時

for(int i=1;iend;i++){

if(vis[i])//i是否在前面使用過

continue;//如果是直接跳過

a=i;//確定start位置的數字,當start為1時就是確定第一位,有10種可能

vis[i]=true;//設置i為已使用狀態,避免下一位使用i

dfs(start+1,end,num);//求得確定start位後的全部序列

vis[i]=false;//設置i為未使用狀態

}

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/154705.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-16 14:14
下一篇 2024-11-16 14:14

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python實現爬樓梯演算法

    本文介紹使用Python實現爬樓梯演算法,該演算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29

發表回復

登錄後才能評論