1. 程式人生 > >面試題筆試題——陣列排序交換次數

面試題筆試題——陣列排序交換次數

作者:雲夢澤

日期: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;
}