面试题笔试题——数组排序交换次数

来源:互联网 发布:负面情绪 知乎 编辑:程序博客网 时间:2024/04/30 13:42

作者:云梦泽

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