【问题标题】:insertion sort algorithm javascript插入排序算法javascript
【发布时间】:2021-07-08 17:16:07
【问题描述】:

在这个算法中

let arr =[8,10,222,36,5,0,0];

let insertionSort = (arr) => {
    let len = arr.length;
    for(let i = 0; i < len; i++){
        let curr = arr[i];
        let j = i - 1;
        while(arr[j] > curr){ 
            arr[j+1] = arr[j];
            j--
        };
        j++
        arr[j] = curr;
    };
    console.log(arr);
};

insertionSort(arr);

为什么是 j--j++

我的意思是他们到底在做什么? ,我们为什么要使用它们? (我明白这一切)

他们在数组中究竟做了什么?改变数字的位置?或者什么。

【问题讨论】:

  • geeksforgeeks.org/insertion-sort您正在移动项目,因此您需要向下移动
  • 对不起,你能解释一下具体怎么做吗?
  • 解释算法。你拿了一张牌,然后沿着牌堆走下去,直到它适合正确的位置(j--)。一旦你找到了正确的位置,它就会把它放到正确的位置。可视化显示它。
  • “我的意思是他们到底在做什么?”:我的理由是…… OP 应该真正专注于一个明确、单一的问题。

标签: javascript algorithm sorting


【解决方案1】:

j++ 用于递增, j-- 用于递减:

for(let i = 0; i < len; i++)

→在这里您可以读取数组 - 从第一项 (i = 0) 到最后一项 (i = len)

    let curr = arr[i];
    let j = i - 1;
    while(arr[j] > curr){ 
        arr[j+1] = arr[j];
        j--
    };
    j++
    arr[j] = curr;

→假设你有一个子数组arr[0..i]。在这里,您以相反的顺序遍历您的子数组。 每次比一个项目高于 arr[i] 时,它就取其前身的价值。它使所有值从一个等级转移到数组的右侧。当 while 循环停止时,数组中位置 j 上的项目采用当前值,通过此操作,您确保您已将 arr[i] 值移动到 arr[0..i] 子数组,确保项目在这个子数组中排序。

请记住,上面 for 循环中的一个不变量是 arr[0..i] 已排序。当您增加 i 并在 for 循环中使用子数组 arr[0..i] 进行新的迭代时,curr 值可以是任何值,但值 arr[0..i] strong>arr[0..i-1] 已排序,因此嵌套的 while 循环确保将 curr 值插入应插入的位置。

例如,让我们使用您的数组[8,10,222,36,5,0,0]。 i = 4:

curr = 36
arr[0..i] = [8,10,222,36]
#iteration of the while loop : 
    j=3: arr[j]=222>curr -> arr[0..i]=[8,10,222,222]
    j=2: arr[j]=10<curr -> end of the while loop
    (arr[j+1] = curr) -> arr[0..i] = [8,10,36,222]
arr[0..4] is sorted

【讨论】:

  • 我知道,我的意思是为什么? ,是为了改变数字的位置还是什么?
  • 你有 2 个嵌套循环,让我编辑答案来解释它 -
【解决方案2】:

算法就像拿一副纸牌。您通过拿起卡片一次对它们进行排序,然后检查它之前的一张是否大于您拥有的那张。您比检查之前的那个和那个直到找到正确的位置。

所以 j-- 是您在您拥有的卡片之前检查每张卡片的部分。您正在将所有卡片向上移动一张以填补抽出卡片的空白。

一旦你找到了位置,j++ 就会用你手中的牌来填补当前的空白。

Grab the current index
         V
1,2,4,5,[3]

Look at 5. Is it greater than 3? Yes, move 5 up
       V
1,2,4,[5],5
j--

Look at 4. Is it greater than 3? Yes, Move 4 up
1,2,[4],4,5
j--

Look at 2. Is it greater than 3? NO, leave the 2 alone

Now we are at the "2" so add one to get to the index where 3 needs to live.
j++
1,2,[3],4,5

【讨论】:

    【解决方案3】:

    澄清一下:这些运算符起​​源于“C”语言。

    i++ 是一个 post-increment 运算符,它返回 i 的当前值,然后将其递增。

    ++i 是一个 pre-increment 运算符,它增加 i 的值,然后返回增加的值。

    从那时起,几乎所有的编程语言都复制了这些非常方便的结构。

    【讨论】:

    • OP 不想知道他们在做什么。 OP 想知道为什么在函数中使用它们。
    • 公平地说,这在 OPs 问题中并不是很清楚。
    • @RBarryYoung 我很容易理解它。
    • @epascarello 那你猜对了。从问题的文字中看不清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多