数组排序

pongo上的一道题,刚好闲下来可以练练手。

题目: 给定一个包含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。

 1 int getMinPos(int *a,int start, int end){
 2     int min = start;
 3     for (int i=start; i<end; i++){
 4         if (a[min] > a[i])
 5             min = i;
 6     }
 7     return min;
 8 }
 9 
10 void switchPos(int *a, int p1, int p2){
11     int t = a[p1];
12     a[p1] = a[p2];
13     a[p2] = t;
14 }
15 
16 int run(int *a, int n){
17     int l=0,r=n,c=0;
18     while(r-l > 1){
19         int minPos = getMinPos(a,l,r);
20         if (minPos != l){
21             switchPos(a,l,minPos);
22             c++;
23         }
24         l++;
25     }
26     /*for (int i=0;i<n;i++)
27         cout<<a[i]<<",";*/
28     return c;
29 }
30 
31 int main(){
32     int a[4] = {4,3,1,2};
33     cout << run(a,4) << endl;
34 }

 

通过交换某两个元素来达到排序的目的,乍一看还以为叫写冒泡排序呢,实际上是要求“交换最优”呢。我第一个想到的办法是每次选出最小,判断位置,如果不是在最低位则与最低位交换,然后将它排除出去,从新数组中往复刚才的流程,直到数组只剩下一个元素为止,preety easy ha,其他方法还没想出来..

posted @ 2013-09-11 18:52  Agentgamer  阅读(276)  评论(0编辑  收藏  举报