Heap’s Algorithm for generating permutations

15 Jun, 2021
Heap’s algorithm is used to generate all permutations of n objects. The idea is to generate each permutation from the previous permutation by choosing a pair of elements to interchange, without disturbing the other n-2 elements. Following is the illustration of generating all the permutations of n given numbers.Example: 
Input: 1 2 3
Output: 1 2 3
        2 1 3
        3 1 2
        1 3 2
        2 3 1
        3 2 1
Algorithm: 
The algorithm generates (n-1)! permutations of the first n-1 elements, adjoining the last element to each of these. This will generate all of the permutations that end with the last element.If n is odd, swap the first and last element and if n is even, then swap the ith element (i is the counter starting from 0) and the last element and repeat the above algorithm till i is less than n.In each iteration, the algorithm will produce all the permutations that end with the current last element.
The algorithm generates (n-1)! permutations of the first n-1 elements, adjoining the last element to each of these. This will generate all of the permutations that end with the last element.
If n is odd, swap the first and last element and if n is even, then swap the ith element (i is the counter starting from 0) and the last element and repeat the above algorithm till i is less than n.
In each iteration, the algorithm will produce all the permutations that end with the current last element.
Implementation:  
C++
Java
Python3
C#
Javascript
// C++ program to print all permutations using// Heap's algorithm#include <bits/stdc++.h>using namespace std; // Prints the arrayvoid printArr(int a[], int n){    for (int i = 0; i < n; i++)        cout << a[i] << " ";    printf("\n");} // Generating permutation using Heap Algorithmvoid heapPermutation(int a[], int size, int n){    // if size becomes 1 then prints the obtained    // permutation    if (size == 1) {        printArr(a, n);        return;    }     for (int i = 0; i < size; i++) {        heapPermutation(a, size - 1, n);         // if size is odd, swap 0th i.e (first) and        // (size-1)th i.e (last) element        if (size % 2 == 1)            swap(a[0], a[size - 1]);         // If size is even, swap ith and        // (size-1)th i.e (last) element        else            swap(a[i], a[size - 1]);    }} // Driver codeint main(){    int a[] = { 1, 2, 3 };    int n = sizeof a / sizeof a[0];    heapPermutation(a, n, n);    return 0;}
// Java program to print all permutations using// Heap's algorithmclass HeapAlgo {    // Prints the array    void printArr(int a[], int n)    {        for (int i = 0; i < n; i++)            System.out.print(a[i] + " ");        System.out.println();    }     // Generating permutation using Heap Algorithm    void heapPermutation(int a[], int size, int n)    {        // if size becomes 1 then prints the obtained        // permutation        if (size == 1)            printArr(a, n);         for (int i = 0; i < size; i++) {            heapPermutation(a, size - 1, n);             // if size is odd, swap 0th i.e (first) and            // (size-1)th i.e (last) element            if (size % 2 == 1) {                int temp = a[0];                a[0] = a[size - 1];                a[size - 1] = temp;            }             // If size is even, swap ith            // and (size-1)th i.e last element            else {                int temp = a[i];                a[i] = a[size - 1];                a[size - 1] = temp;            }        }    }     // Driver code    public static void main(String args[])    {        HeapAlgo obj = new HeapAlgo();        int a[] = { 1, 2, 3 };        obj.heapPermutation(a, a.length, a.length);    }} // This code has been contributed by Amit Khandelwal.
# Python program to print all permutations using# Heap's algorithm # Generating permutation using Heap Algorithmdef heapPermutation(a, size):     # if size becomes 1 then prints the obtained    # permutation    if size == 1:        print(a)        return     for i in range(size):        heapPermutation(a, size-1)         # if size is odd, swap 0th i.e (first)        # and (size-1)th i.e (last) element        # else If size is even, swap ith        # and (size-1)th i.e (last) element        if size & 1:            a[0], a[size-1] = a[size-1], a[0]        else:            a[i], a[size-1] = a[size-1], a[i]  # Driver codea = [1, 2, 3]n = len(a)heapPermutation(a, n) # This code is contributed by ankush_953# This code was cleaned up to by more pythonic by glubs9
// C# program to print all permutations using// Heap's algorithmusing System; public class GFG {    // Prints the array    static void printArr(int[] a, int n)    {        for (int i = 0; i < n; i++)            Console.Write(a[i] + " ");        Console.WriteLine();    }     // Generating permutation using Heap Algorithm    static void heapPermutation(int[] a, int size, int n)    {        // if size becomes 1 then prints the obtained        // permutation        if (size == 1)            printArr(a, n);         for (int i = 0; i < size; i++) {            heapPermutation(a, size - 1, n);             // if size is odd, swap 0th i.e (first) and            // (size-1)th i.e (last) element            if (size % 2 == 1) {                int temp = a[0];                a[0] = a[size - 1];                a[size - 1] = temp;            }             // If size is even, swap ith and            // (size-1)th i.e (last) element            else {                int temp = a[i];                a[i] = a[size - 1];                a[size - 1] = temp;            }        }    }     // Driver code    public static void Main()    {         int[] a = { 1, 2, 3 };        heapPermutation(a, a.Length, a.Length);    }} /* This Java code is contributed by 29AjayKumar*/
<script> // JavaScript program to print all permutations using// Heap's algorithm // Prints the arrayfunction printArr(a,n){    document.write(a.join(" ")+"<br>");     } // Generating permutation using Heap Algorithmfunction heapPermutation(a,size,n){        // if size becomes 1 then prints the obtained        // permutation        if (size == 1)            printArr(a, n);          for (let i = 0; i < size; i++) {            heapPermutation(a, size - 1, n);              // if size is odd, swap 0th i.e (first) and            // (size-1)th i.e (last) element            if (size % 2 == 1) {                let temp = a[0];                a[0] = a[size - 1];                a[size - 1] = temp;            }              // If size is even, swap ith            // and (size-1)th i.e last element            else {                let temp = a[i];                a[i] = a[size - 1];                a[size - 1] = temp;            }        }} // Driver codelet a=[1, 2, 3];heapPermutation(a, a.length, a.length);  // This code is contributed by rag2127 </script>
Output: 
1 2 3
2 1 3
3 1 2
1 3 2
2 3 1
3 2 1
References: 1. “https://en.wikipedia.org/wiki/Heap%27s_algorithm#cite_note-3This article is contributed by Rahul Agrawal .If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
29AjayKumar
sanskar27jain
ankush_953
bhargavbhatiya
jontefry
rag2127
permutation
Combinatorial
permutation
Combinatorial
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Count of subsets with sum equal to X
Find the K-th Permutation Sequence of first N natural numbers
Count Derangements (Permutation such that no element appears in its original position)
Find the Number of Permutations that satisfy the given condition in an array
Stack Permutations (Check if an array is stack permutation of other)
Lexicographic rank of a string
Python program to get all subsets of given size of a set
Number of unique pairs in an array
Find all distinct subsets of a given set using BitMasking Approach
Probability of getting K heads in N coin tosses