#include #include #include void swap(char* left, char* right){ char temp = *left; *left = *right; *right = temp; } int compare (const void * a, const void * b){ return ( *(char*)a - *(char*)b ); } void PrintSortedPermutations(char str[]) { int strSize = strlen(str); qsort(str, strSize, sizeof(char), compare); int largerPermFound = 1; do{ // 1. Print permutation printf("%s\n", str); // 2. Find rightmost char that is smaller than char to its right int i; for (i = strSize - 2; i >= 0 && str[i] >= str[i+1]; --i){} // if we couldn't find one, we're finished, else we can swap if (i >= 0){ // 3. find character at index j such that str[j] = min(str[k]) && str[k] > str[i] for all k > i int j = i+1, k; for(k=j; k str[i] && str[k] < str[j]) j = k; } // 3. Swap chars at i and j swap(&str[i], &str[j]); // 4. Sort string to the right of i qsort(str+i+1, strSize-i-1, sizeof(char), compare); } else largerPermFound = 0; } while(largerPermFound); } int main() { int n; //size of string scanf("%d\n",&n); char str[n]; scanf("%s",str); PrintSortedPermutations(str); return 0; }