題目說明 本題來自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; }