zoukankan      html  css  js  c++  java
  • 数组排序

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

  • 相关阅读:
    2013111 小有收获
    2013112 周末
    js return的使用 Yannis
    java与js的split方法 Yannis
    javaScript 实时获取系统时间 Yannis
    java中奇偶数的判断 Yannis
    将Tomcat添加至开机自启动 Yannis
    java除0问题探究 Yannis
    linux安装问题 Yannis
    java之Struts2实现用户登录过滤 Yannis
  • 原文地址:https://www.cnblogs.com/agentgamer/p/3315205.html
Copyright © 2011-2022 走看看