1. 程式人生 > >字典序排序演算法實現_C(換位數)

字典序排序演算法實現_C(換位數)

第一次寫,有點小激動!

程式設計對於工科學生的重要性不言而喻,如果你喜歡這篇文章,歡迎一起交流學習!

什麼是字典排序演算法?

e.g. list[]={1,2,3}, 全排如下


對於三個數字(1,2,3),排列組合依次增大,就是字典序法。

e.g. 用字典序法找12354的下一個排列

註釋:對於1,2,3,4,5 。最大數字54321,最小數字12345 。稱12345完全順序,54321完全逆序。

  1. 如果當前排列是12354, 先要找到逆序區“54”
  2. 再找到逆序前的一個數字3
  3. 再找到逆序區比3大的最小數字4
  4. 再交換兩者得到12453
  5. 最後排序逆序區53,得到12435

至此演算法中的一次迭代完成完成,還需要做的就是繼續迭代輸出所有結果。

例如list[]={1,2,3} 共有3*2*1=6次迭代,list[]={1,2,3,4}共有4*3*2*1=24次迭代。


總結起來:
    1. 從這個序列中從右至左找第一個左鄰小於右鄰的數(從後向前檢視逆序區域,找到逆序區域的前一位,也就是數字置換的邊界)
    2. 把逆序區域的前一位和逆序區域中剛剛大於它的數字交換位置

    3. 把原來的逆序區域轉為順序

歡迎交流:[email protected]

/**************************
作者:MATE
功能:字典序演算法
輸入:排序內容
輸出:字典序全排
***************************/
#include<stdio.h>
void show(int list[],int n);
void swap(int list[],int a,int b);
void bubbleSort(int list[],int a,int n);
void dictionaryOrderAlgorithm(int list[],int n);
int main()
{
	int list[]={1,2,3,4,5,6,7,8,9};
	int n=0;
	printf("How many numbers:");
	scanf("%d",&n);
	dictionaryOrderAlgorithm(list,n);
}

void show(int list[],int n)
{
    for(int i=0;i<n;i++)
        printf("%d ",list[i]);
    printf("\n");
}
void swap(int list[],int a,int b)
{
    int temp=0;
    temp=list[a];
    list[a]=list[b];
    list[b]=temp;
}
void bubbleSort(int list[],int a,int n)
{
    int temp;
    int flag=1;
    while(flag==1)
    {
        flag=0;
        for(int i=n-1;i>a+1;i--)
        {
            if (list[i]<list[i-1])
            {
                temp=list[i-1];
                list[i-1]=list[i];
                list[i]=temp;
                flag=1;
            }
        }
    }
}
void dictionaryOrderAlgorithm(int list[],int n)
{
    //list[a]記錄第一個左比右小的數字
    //list[b]記錄逆序區中最小的比list[a]大的數字
    int a=0,b=0;
    //計算迴圈輪次
    int num=1;
    for(int i=n;i>0;i--)
        num=num*i;
    for(int j=0;j<num;j++)
    {
        //展示當前情況
    show(list,n);
    //尋找list[a]
    for(int i=n-1;i>0;i--)
    {
        if(list[i-1] < list[i])
        {
            a=i-1;
            break;
        }
    }
    //尋找list[b]
    int min=65535;
    for(int i=n-1;i>a;i--)
    {
        if(list[i] < min && list[i]>list[a])
        {
            b=i;
            min=list[i];
        }

    }
    //交換list[a]與list[b]
    swap(list,a,b);
    //排序逆序區
    bubbleSort(list,a,n);
    }
}

相關推薦

字典排序演算法實現_C位數

第一次寫,有點小激動!程式設計對於工科學生的重要性不言而喻,如果你喜歡這篇文章,歡迎一起交流學習!什麼是字典排序演算法?e.g. list[]={1,2,3}, 全排如下對於三個數字(1,2,3),排列組合依次增大,就是字典序法。e.g. 用字典序法找12354的下一個排列註

字典排序演算法解析

1.1簡述 字典序排序演算法是一種對於隨機序列生成全排列的排序方法。例如對於隨機變數X={1,2,3},則生成的全排列為:{1,2,3}、{1,3,2}、{2,1,3}、{2,3,1}、{3,1,2}、{3,2,1}。 1.2字典序排序的求解步驟: (1)從右至左找出陣列(

Atitit 演算法原理與導論 目錄 1. Attilax總結的有用演算法 按用途分類 1 1.1. 排序演算法 字串匹配String Matching 1 1.2. 加密演算法 編碼演算法 序列

Atitit 演算法原理與導論   目錄 1. Attilax總結的有用演算法 按用途分類 1 1.1. 排序演算法  字串匹配(String Matching) 1 1.2. 加密演算法  編碼演算法  序列化演算法 1 1.3. 查

淺談排序演算法的效率Java筆記

排序演算法有很多種,每一種都有其優缺點,可以適應不同的場合。排序演算法的好壞,主要是看排序效率,排序效率的一個重要指標就是速度,速度是影響排序演算法的最主要因素。 一般來說,判斷一個演算法的優劣,可以

幾個內部排序演算法的總結JAVA版

插入排序 1、直接插入排序 public void insertSort(int[] a){ for(int i=0;i<a.length;i++){ int key=a[i]; int pos=i; while(pos>0&&a

各類排序演算法詳解java版

摘要 整理了一些有關於排序演算法的資料,用java手寫了一些,有些博主懶得寫程式碼了就直接copy了網上的程式碼。在文章的最後還給出排序演算法穩定性的定義以及哪些是穩定的排序演算法。 目錄 一、快速排序 二、堆排序 三、插入排序 四、氣泡排序

常用的排序演算法詳解C#版

只要是搞程式設計的演算法、資料結構、作業系統、計算機組成原理這些東西都會有用到,就像醫生給人治病一樣,只有瞭解了人的內部機理、運作機制,才能很好的做到對症下藥,藥到病除。而上面所說的那些計算機理論課就好像人的內部機理一樣,我們往往都把這些東西給忽略了,而把更多的精力放在具體的程式語言實現上,當然我也是這樣,

各種基本演算法實現小結—— 排序演算法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

快速排序演算法詳解原理、實現和時間複雜度

快速排序是對氣泡排序的一種改進,由 C.A.R.Hoare(Charles Antony Richard Hoare,東尼·霍爾)在 1962 年提出。 快速排序的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料比另一部分的所有資料要小,再按這種方法對這兩部分資料分別進行快速排

希爾排序演算法實現C++

希爾排序是一種按照增量排序的方法。其中增量值是小於n的正整數。   shell排序的基本思想[1]是:     先取一個小於n的整數d1作為第一個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同一個組中。先在各組內進行直接插人排序;然後,取第二個增量d2<d1重複上述的分組和排序,直

插入排序演算法詳解C++實現

插入排序 輸入:n個數(a1,a2,...,an)。 輸出:輸入序列的一個排列(a1',a2',...,an'),使得a1'到an'為有序序列。 待排序的數稱為關鍵字key。 插入排序與平時生活中打牌時,整理手中牌的順序相似。最開始手中沒有牌,我們從桌上摸起一張牌,將它

常用資料結構與排序演算法實現、適用場景及優缺點Java

1.下壓棧(後進先出)(能夠動態調整陣列大小的實現): package Chapter1_3Text; import java.util.Iterator; public class ResizingArrayStack<Item> implements

快速排序演算法實現C++

快速排序採用的是分治法,其平均時間複雜度為O(nlogn) 一趟快速排序的演算法是[1]:   1)設定兩個變數I、J,排序開始的時候:I=0,J=N-1;   2)以第一個陣列元素作為關鍵資料,賦值給key,即 key=A[0];   3)從J開始向前搜尋,即由後開

演算法】二叉樹、N叉樹先、中、後、BFS、DFS遍歷的遞迴和迭代實現記錄Java版

        本文總結了刷LeetCode過程中,有關樹的遍歷的相關程式碼實現,包括了二叉樹、N叉樹先序、中序、後序、BFS、DFS遍歷的遞迴和迭代實現。這也是解決樹的遍歷問題的固定套路。 一、二叉樹的先序、中序、後序遍歷  1、遞迴模板  (1)

【java】java反射機制,動態獲取對象的屬性和對應的參數值,並屬性按照字典排序,Field.setAccessible()方法的說明【可用於微信支付 簽名生成】

modifier 直接 this 字段值 1-1 讓我 toupper ima play 方法1:通過get()方法獲取屬性值 package com.sxd.test.controller; public class FirstCa{ private

拓撲排序|Topological Sort類演算法題心得PYTHON版

拓撲排序 尋找專案之間依賴順序的過程稱為拓撲排序(topological sorting)。   首先要了解有向無環圖|Directed Acyclic Graph: 用字典表示:G = { 'a':'bce', 'b':'d','c':'d','d':'','e':'cd'} Key

推薦系統中協同過濾演算法實現分析重要兩個圖!!

“協”,指許多人協力合作。 “協同”,就是指協調兩個或者兩個以上的不同資源或者個體,協同一致地完成某一目標的過程。 “協同過濾”,簡單來說,就是利用興趣相投或擁有共同經驗的群體的喜好來給使用者推薦感興趣的資訊,記錄下來個人對於資訊相當程度的迴應(如評分),以達到過濾的目的,進而幫助別人篩

SWUST資料結構--希爾排序演算法實現

#include<iostream> using namespace std; int main(){ int i,n; int a[50]; cin>>n; for(i=0;i<n;i++) cin>>a[i]; for(i=0;i<

OpenCV下車牌定位演算法實現程式碼

             分類:            影象處理

JAVA 利用Arraylist.sort()進行排序實現comparable介面的實現

1.什麼是Comparable介面 此介面強行對實現它的每個類的物件進行整體排序。此排序被稱為該類的自然排序 ,類的 compareTo 方法被稱為它的自然比較方法 。實現此介面的物件列表(和陣列)可以通過 Collections.sort (和 Arrays.sort )進行自動排序。實現此介面的