原地置换排序
今天在水母算法版看到一道题,挺有意思,题目描述如下:
题目:
   一个数组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
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; } } } } }
 
                    
                 

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号