js排序1排序算法

发布于 2022-09-12 23:36:11 字数 55 浏览 8 评论 0

请问数组[1,2,3,4,5,6,7,8,9]如何按照[1,4,7,2,5,8,3,6,9]排序

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

橘味果▽酱 2022-09-19 23:36:11

如果只是解决这个问题:

const data = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(data.sort((a, b) => (a + 2) % 3 - (b + 2) % 3));

如果要通用

/**
 * @param {number[]} data 数据源
 * @param {number} divisor 除数
 * @param {number} offset 偏移量,根据要排在第 1 个的数字来计算,余数是 0 的会排在前面
 * @returns 
 */
function sortByMod(data, divisor, offset) {
    return data.sort((a, b) => (a + offset) % divisor - (b + offset) % divisor);
}

console.log(sortByMod(data, 3, 2));

现在问题是要计算 offset 比较累,还不如直接用第 1 个数据来计算,所以

function sortByMod2(data, divisor) {
    const offset = divisor - data[0] % 3;
    return data.sort((a, b) => (a + offset) % divisor - (b + offset) % divisor);
}
明媚殇 2022-09-19 23:36:11

取余运算符%来区分数据

        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]
回忆凄美了谁 2022-09-19 23:36:11

来个通用算法

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)
世界如花海般美丽 2022-09-19 23:36:11
    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进行处理
你的规律应该是根据除余排序后再根据大小排序

  1. 先根据除余排序 a%3-b%3
  2. 相同余数根据数值排序 即a%3-b%3==0时根据a-b
  3. 然后看示例里 3,6,9排在最后 所以余数排序改为(a-1)%3-(b-1)%3
自在安然 2022-09-19 23:36:11

参考@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]

希望对您有帮助。

美羊羊 2022-09-19 23:36:11
    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]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文