全排列的C語言實現


  大一的時候沒有好好學,后來都是要還的QAQ

  大三重修了C語言(刷分)。再次遇到了全排列這道題,之前是直接抄的書上的代碼,沒有認真理解意思。在大二學習中也知道了全排列是依靠遞歸實現的,索性這次就沒有參考文章,自己寫了一個全排列出來。(代碼運行效率看起來還可以)

  核心思想是遞歸地交換兩個數字。for循環意味着對level-1之后的數字遍歷交換一次。

  因為交換了數字,所以在遞歸出口的時候要把之前的交換還原。(想象整個過程,而不是細節就會明白)

  寫出來也挺簡單的,十幾分鍾的事情orz,還是大一太佛了,沒有認真學習,否則現在也不會這么艱難啊QAQ。

  不說了不說了,最后附上代碼:

輸入:一個數字n,代表hash數組中的前幾位參與全排列。

輸出:數字的全排列,以從小到大的順序排列,共$A^n_n$個

#include <stdio.h>
int hash[15] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
int loc;

void print()
{
    int i;
    for(i = 0; i < loc; i++)
        printf("%d ", hash[i]);
    printf("\n");
    return;
}

void swap(int src, int dst)
{
    int temp;
    temp = hash[src];
    hash[src] = hash[dst];
    hash[dst] = temp;

}

void sort(int level)
{
    int i;
    if(level == loc){
        print();
        return;
    }
    sort(level + 1);
    for(i = 0; i+level < loc; i++){
        swap(level + i, level - 1);
        sort(level + 1);
    }
    for(i = loc - level - 1; i>= 0;i--)
        swap(level+i, level - 1);
}

int main()
{
    scanf("%d", &loc);
    sort(1);
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM