// StringSort 2014.09.07 by あすかぜ // クイックソートでテーブルを文字コード順にソートします。 // 編集・再配布は自由です。 // // 使い方: // このファイルは「StringSort.cms」という名前で Macro フォルダに置いてください。 // 任意のマクロファイル内で、 // StringSort.qsort(l,t,r,b,x,d); // とすると実行できます。 // ただし、l,t,r,b はそれぞれソート範囲の左端、上端、右端、下端 // x はソート対象とする列 // d は昇順ならば False, 降順ならば True // // クイックソートでは、ソート対象列が同じ値のデータに関しては // 順番が保存されません。 // 複数列をキーにする場合などはこのファイルをコピーして、 // compare 関数をうまく書き直してください。 function strCompare(str1, str2) { if (str1 == str2) { return 0; } else if (str1 == "") { return -1; } else if (str2 == "") { return 1; } c1 = ascW(str1); c2 = ascW(str2); if (c1 == c2) { return strCompare(mid(str1, 2), mid(str2, 2)); } return c1 - c2; } function compare(y1, y2, x) { return strCompare(str([x,y1]), str([x,y2])); } function swaprow(y1, y2, l, r){ for(x=l; x<=r; x++){ swap([x,y1],[x,y2]); } } function qsort(l, t, r, b, x, d){ y = (t-0)+1; while(y <= b && compare(y,t,x) == 0){ y++; } if(y > b){ return; } if(compare(y,t,x) > 0){ p = y; }else{ p = t; } y1 = t; y2 = b; while(y1 <= y2){ while(!d && compare(y1,p,x) < 0 && y1 <= y2){ y1++; } while(!d && compare(y2,p,x) >= 0 && y1 <= y2){ y2--; } while( d && compare(y1,p,x) >= 0 && y1 <= y2){ y1++; } while( d && compare(y2,p,x) < 0 && y1 <= y2){ y2--; } if(y1 < y2){ if(p == y1){ p = y2; }else if(p == y2){ p = y1; } swaprow(y1,y2,l,r); } } if(t < y2){ qsort(l,t,r,y2,x,d); } if(y1 < b){ qsort(l,y1,r,b,x,d); } } // 引数を省略可能に function qsort(l, t, r, b, x){ qsort(l,t,r,b,x,False); } // 引数を省略可能に function qsort(l, t, r, b){ qsort(l,t,r,b,l,False); } // 普通のマクロとして実行するとソートパネルを開く Sort();