Re: whats wrong with this code ?!
- To: mathgroup at smc.vnet.net
- Subject: [mg110480] Re: whats wrong with this code ?!
- From: Themis Matsoukas <tmatsoukas at me.com>
- Date: Sun, 20 Jun 2010 03:46:10 -0400 (EDT)
Get a good night's sleep. Then, fix the line { qksort[z,left,i-1][[left;;i-1]], z[[i]], qksort[z,i+1,right][[i+1;;right]] } If qksort[z,left,i-1] contains fewer elements that i-1, or qksort[z,i+1,right] contains fewer than right, you will get the error message. You may try to debug your qksort using a couple print statements, as in the example below: qksort[x_List, left_Integer, right_Integer] := If[right - left >= 1, Module[{i, z}, {i, z} = split[x, left, right]; Print["1--", {qksort[z, left, i - 1], {left, i - 1}}]; Print["2--", {qksort[z, i + 1, right], {i + 1, right}}]; {qksort[z, left, i - 1][[left ;; i - 1]], z[[i]], qksort[z, i + 1, right][[i + 1 ;; right]]} // Flatten], x] This will print your lists before picking out their parts, and will also show you which parts are to be picked. Themis On Jun 19, 2010, at 7:47 AM, becko wrote: > ok. I give up. I've been struggling with this the entire night. I have > three functions: swap[..], split[..] and qksort[..]. The objective is to > implement a recursive sort algorithm. I have tried to execute it on > list={2,5,4,7,9,1};. But I keep getting the "Cannot take positions .. > through .. in .." message. You may need to execute it a few times to see > the error (because of it depends on the RandomInteger). Here are the > three functions. Thanks in advance. > > swap[x_List,i_Integer,j_Integer]:=ReplacePart[x,{i->x[[j]],j->x[[i]]}] > > slowsort[x_List]:= > Module[{z=x}, > Do[ > If[z[[j]]<z[[r]],z=swap[z,j,r]], > {r,1,Length[z]-1},{j,r+1,Length[z]} > ]; > z > ] > > split[x_List,left_Integer,right_Integer]:= > Module[{L=RandomInteger[{left,right}],z,T,i=left}, > T=x[[L]];z=swap[x,left,L]; > Do[ > If [ z[[j]]<T,z=swap[z,++i,j] ], > {j,left+1,right} > ]; > z=swap[z,left,i]; > {i,z} > ] > > qksort[x_List,left_Integer,right_Integer]:= > If[right-left>=1, > Module[{i,z}, > {i,z}=split[x,left,right]; > {qksort[z,left,i-1][[left;;i-1]],z[[i]],qksort[z,i+1,right][[i+1;;right]]}//Flatten > ], > x > ] >