请问数组[1,2,3,4,5,6,7,8,9]如何按照[1,4,7,2,5,8,3,6,9]排序
取余运算符%来区分数据
var arr = [1,2,3,4,5,6,7,8,9];
var arr1 = [];
var arr2 = [];
var arr0 = [];
arr.forEach(item => {
if(item % 3 === 1){
arr1.push(item)
}else if(item % 3 === 2){
arr2.push(item)
}else if(item % 3 === 0){
arr0.push(item)
}
})
var result = [].concat(arr1, arr2, arr0)
console.log(result); //[1, 4, 7, 2, 5, 8, 3, 6, 9]
来个通用算法
let a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]; // 要排序的数组
let p = 3; // 间隔分段数
let i = 0;
let r = []; // 排序结果
let t = []; // 临时缓存剩余排序数组
while (a.length > 0) {
let v = a.shift();
if (i % p === 0) {
r.push(v)
} else {
t.push(v)
}
i++;
if (a.length === 0 && t.length !== 0) {
a = t;
t = [];
i = 0;
p -= 1;
}
}
console.log(r)
var arr = [3,2,9,4,1,6,7,8,5]
var narr = arr.sort(function(a,b){
if((a-1)%3-(b-1)%3==0){
return a-b
}else{
return (a-1)%3-(b-1)%3
}
});
console.log(narr)
sort方法排序是两个值相减根据正负值还是0进行处理
你的规律应该是根据除余排序后再根据大小排序
参考@gauseen 写了一个通用方法,代码如下:
/**
* 排序算法
*
* @param { Array } from 源数组,默认值:[]
* @param { Number } gap 间隔分段数,默认值:3
* @param { Number } cutIndex 开始分段索引,默认值:0
* @returns { Array } 排序结果数组
*/
function sortArray(from = [], gap = 3, cutIndex = 0) {
// 如果源数组长度小于3,无需排序直接返回。
const fromLeng = from.length;
if (fromLeng < 3) return;
let to = [], start = cutIndex;
while (start < fromLeng) {
let end = fromLeng - cutIndex;
to.push(from[start]);
start += gap;
if (start >= fromLeng && cutIndex < end && to.length < end) {
// 重置索引
start = ++cutIndex;
}
}
return to;
}
// 测试一
const arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
sortArray(arr1, 3, 0); // [1, 4, 7, 10, 2, 5, 8, 3, 6, 9]
sortArray(arr1, 3, 1); // [2, 5, 8, 3, 6, 9, 4, 7, 10]
// 测试二
const arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18];
sortArray(arr2, 3, 0); // [1, 4, 7, 10, 13, 16, 2, 5, 8, 11, 14, 17, 3, 6, 9, 12, 15, 18]
sortArray(arr2, 3, 1); // [2, 5, 8, 11, 14, 17, 3, 6, 9, 12, 15, 18, 4, 7, 10, 13, 16]
希望对您有帮助。
const arr = [1,2,3,4,5,6,7,8,9,10]
// 间隔数
const gap = 3
function solution(startIndex, arr, r = []) {
for(let i = startIndex; i < arr.length; i += gap) {
r.push(arr[i])
if (i + gap > arr.length - 1 && r.length !== arr.length) {
solution(startIndex + 1, arr, r)
}
}
return r
}
console.log('result: ', solution(0, arr)); // [1, 4, 7, 10, 2, 5, 8, 3, 6, 9]
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答1.4k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
如果只是解决这个问题:
如果要通用
现在问题是要计算
offset
比较累,还不如直接用第 1 个数据来计算,所以