面試題筆試題——陣列排序交換次數
阿新 • • 發佈:2018-12-24
作者:雲夢澤
日期:20131110
題目:給定一個包含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);(特別指出:1 3 5 6 2 7 4變為有序序列交換次數為4)
看過一些網上別人寫的程式,但有些有很大問題,比如對紅色標記的這個序列結果可能給出的是5,其實只需4次交換便可,所以不嚴謹,雖然有些序列能得到正確結果。
我的思路:假設位置 1 2 3 4 5 6 7 (實際上位置索引從0開始,為方便理清思路,假設從1開始)
給定序列 (1) (3) (5) (6) (7) (5) (4)
我們依次遍歷陣列序列
1. 1(1)位置序號本身對應,無需交換
2. 2(3),3(2)為位置序號相互互動型別,我們只要交換一次便可將數字復位,pair計數
3. 4(6), 該情形將(6)通過交換復位,但此時4號位還是不一定為(4),所以下次檢測時還是從此處開始,singl計數
直接上程式碼:
/*Ahthot:LiuZeKun---------------------- *DateTime:20131109-------------------- *Description:陣列排序次數-----------*/ #include <iostream> using namespace std; int run(const int *a,int n); int main() { int a[100]; int sortCount=0; int n; cin>>n; for(int i=0;i<=n-1;i++) cin>>a[i]; sortCount=run(a,n); cout<<"排序交換次數為: "<<sortCount<<endl; return 0; } int run(const int *a,int n) { int pair=0,singl=0,temp=0; //pair 統計位置對; singl:統計不成對;temp:存放臨時值 int TempArray[100]; //臨時陣列 memcpy(TempArray,a,sizeof(TempArray)); for(int i=0;i<=n-1;i++) { if(TempArray[i]==i+1)// continue; else if(TempArray[TempArray[i]-1]==i+1) pair+=1; else { temp=TempArray[TempArray[i]-1]; TempArray[TempArray[i]-1]=TempArray[i]; TempArray[i]=temp; singl+=1; i-=1; } } return (pair/2)+singl; }