程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 數組排序 --- 龐果

數組排序 --- 龐果

編輯:C++入門知識

題目說明 本題來自caopengcs,只要你有興趣,每個人都可以出題(出題入口在主頁右側邊欄“貢獻題目”內),以下是題目詳情: 給定一個包含1-n的數列,我們通過交換任意兩個元素給數列重新排序。 求最少需要多少次交換,能把數組排成按1-n遞增的順序,其中,數組長度不超過100。 例如: 原數組是3,2,1, 我們只需要交換1和3就行了,交換次數為1,所以輸出1。 原數組是2,3,1,我們需要交換2和1,變成1,3,2,再交換3和2,變為1,2,3,總共需要的交換次數為2,所以輸出2。 函數頭部: C/C++ int run(const int *a,int n); 算法描述 實際上,這個題目是一個N個連續數的排序,題目中有個條件需要注意一下,比如四個數,肯定是1,2,3,4這四個,不會是1,3,4,5,所以是連續數的排序,要做到交換次數最少,需要做到的只有一點: 每次交換後,交換的數中至少有一個數不需要在動了,也就是每次交換都要有直接的效果, 為了滿足這個條件,我們可以這麼來交換: 先把“1”交換到位置“1”上 然後依次把各個數交換到他們自己的位置上 位置上正好是這個數的不需要交換 滿足上面三點要求並進行交換就行了。 代碼很簡單,也沒做什麼優化,都傳到github上了。

int run(const int *a,int n)  
{  
    int *b=(int *)malloc(sizeof(int)*n);  
    int count=0;  
    int temp;  
    for(int i=0;i<n;i++)  
        b[i]=a[i];  
      
      
    for(int i=0;i<n;i++)  
    {  
        for(int k=i;k<n;k++)  
        {  
            if(b[k]==i+1 && k!=i)  
            {  
                count++;  
                temp=b[k];  
                b[k]=b[i];  
                b[i]=temp;  
            }  
        }  
    }  
      
    return count;  
}  

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved