数组排序
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,其他方法还没想出来..