原地置换排序

  今天在水母算法版看到一道题,挺有意思,题目描述如下:

  题目:

   一个数组arr[],大小为n,给其中每个元素一个编号(编号范围为1至n-1,且没有重复的编号),编号放在nums[]数组中且一一对应,比如arr[0]的编号为nums[0],arr[1]的新地址为nums[1]。。。
  要求:

  在O(1)的辅助空间下对数组按其编号从小到大进行排序
sample:

    arr={a,b,c,d,e}
    nums={2,0,3,1,4}
output:

    arr={b,d,a,c,e}

简单分析:

  对编号进行排序,排序过程中对arr数组进行同步调整,不过该方法的时间复杂度是O(N*lg(N))。那有没有更好的方法能? 当然有,下面以数组类型为string为例,先贴代码,该实现的时间复杂度为O(N),下次有时间仔细分析一下实现思路。

 

View Code
bool insituReplaceSort(string  *arr, int *nums, int n)
{
  for (int i = 0; i < n; i++)
  {
     if (nums[i] != -1)
     {
       string str = arr[i];
       int idx = i;
       while (true)
       {
         string sx = arr[nums[idx]];
         arr[nums[idx]] = str;
         int ix = idx;
         str = sx;
         idx = nums[idx];
         nums[ix] = -1;
         if (nums[idx] == -1)
         {
           break;
         }
       }
     }
  }
}

 

 

 

posted @ 2012-05-24 01:46  beyond_boy  阅读(1097)  评论(0)    收藏  举报