Javascript 如何按索引数组重新排列数组(证明)?
给定数组Javascript 如何按索引数组重新排列数组(证明)?,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,给定数组arr和索引数组ind,以下算法将arr重新安排到位,以满足给定索引: function swap(arr, i, k) { var temp = arr[i]; arr[i] = arr[k]; arr[k] = temp; } function rearrange(arr, ind) { for (var i = 0, len = arr.length; i < len; i++) { if (ind[i] !== i) { swap(ar
arr
和索引数组ind
,以下算法将arr
重新安排到位,以满足给定索引:
function swap(arr, i, k) {
var temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
function rearrange(arr, ind) {
for (var i = 0, len = arr.length; i < len; i++) {
if (ind[i] !== i) {
swap(arr, i, ind[i]);
swap(ind, i, ind[i]);
}
}
}
证明该算法有效的最有说服力的方法是什么?该算法不起作用,它足以显示一个反例:
var arr = ["A", "B", "C", "D"];
var ind = [ 2, 3, 1, 0];
rearrange(arr, ind);
console.log(arr); // => ["C", "D", "A", "B"]
一个可行的替代方案可能是
function swap(arr, i, k) {
var temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
function rearrange(arr, ind) {
for (var i = 0, len = arr.length; i < len; i++) {
if (ind[i] !== i) {
swap(arr, i, ind[i]);
swap(ind, i, ind[i]);
if (ind[i] < i) {
i = ind[i]-1;
}
}
}
}
功能交换(arr、i、k){
var-temp=arr[i];
arr[i]=arr[k];
arr[k]=温度;
}
功能重新排列(arr、ind){
对于(变量i=0,len=arr.length;i
此算法不起作用,它足以显示一个反例:
var arr = ["A", "B", "C", "D"];
var ind = [ 2, 3, 1, 0];
rearrange(arr, ind);
console.log(arr); // => ["C", "D", "A", "B"]
一个可行的替代方案可能是
function swap(arr, i, k) {
var temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
function rearrange(arr, ind) {
for (var i = 0, len = arr.length; i < len; i++) {
if (ind[i] !== i) {
swap(arr, i, ind[i]);
swap(ind, i, ind[i]);
if (ind[i] < i) {
i = ind[i]-1;
}
}
}
}
功能交换(arr、i、k){
var-temp=arr[i];
arr[i]=arr[k];
arr[k]=温度;
}
功能重新排列(arr、ind){
对于(变量i=0,len=arr.length;i
编写一组测试用例,并证明它们通过了。。。?!为什么你认为这个算法首先有效?根据索引,输出不应该是[“E”、“A”、“F”、“C”、“B”、“D”]
?@gurvinder372。。。?为什么?@deceze除非我遗漏了什么,否则按照[4,0,5,2,1,3]
重新排列[“A”,“B”,“C”,“D”,“E”,“F”]
应该给出[“E”,“A”,“F”,“C”,“B”,“D”]
对吗?由于E
位于第四个索引,而A
位于第0个索引..?@gurvinder372不确定您在那里应用了什么逻辑。。。第二个数组似乎包含第一个数组中相同键的值所需的索引arr[0]
应转到索引ind[0]
,即4
,这意味着“A”应转到位置4
。编写一组测试用例并显示它们通过了。。。?!为什么你认为这个算法首先有效?根据索引,输出不应该是[“E”、“A”、“F”、“C”、“B”、“D”]
?@gurvinder372。。。?为什么?@deceze除非我遗漏了什么,否则按照[4,0,5,2,1,3]
重新排列[“A”,“B”,“C”,“D”,“E”,“F”]
应该给出[“E”,“A”,“F”,“C”,“B”,“D”]
对吗?由于E
位于第四个索引,而A
位于第0个索引..?@gurvinder372不确定您在那里应用了什么逻辑。。。第二个数组似乎包含第一个数组中相同键的值所需的索引arr[0]
应该转到索引ind[0]
,即4
,这意味着“A”应该转到位置4
。噢,哇!非常感谢您提供了一个简单的反例!我创建了一个。你可能想在那里添加你的建议。哦,哇!非常感谢您提供了一个简单的反例!我创建了一个。您可能想在这里添加您的建议。