基于JavaScript的插入排序算法

基于JavaScript的插入排序算法,javascript,algorithm,Javascript,Algorithm,我最近开始学习基于这本书的算法 我停止了第12章-排序算法 我不明白插入排序是如何工作的 以下是我正在使用的代码: 下面是让我困惑的部分: function insertionSort() { var temp, inner; for (var outer = 1; outer <= this.dataStore.length - 1; ++outer) { temp = this.dataStore[outer]; inner = oute

我最近开始学习基于这本书的算法

我停止了第12章-排序算法

我不明白插入排序是如何工作的

以下是我正在使用的代码:

下面是让我困惑的部分:

function insertionSort() {
    var temp, inner;
    for (var outer = 1; outer <= this.dataStore.length - 1; ++outer) {
        temp = this.dataStore[outer];
        inner = outer;
        while (inner > 0 && (this.dataStore[inner-1] >= temp)) {
            this.dataStore[inner] = this.dataStore[inner-1];
            --inner;
        }
        this.dataStore[inner] = temp;
    }
    console.log(this.toString());
}
函数插入排序(){
变量温度,内部;
对于(var outer=1;outer 0&&(this.dataStore[inner-1]>=temp)){
this.dataStore[inner]=this.dataStore[inner-1];
--内在的;
}
this.dataStore[inner]=temp;
}
console.log(this.toString());
}

有人能帮忙解释一下这段代码吗?

这是一种排序算法,从数组的开头开始,一直到最后。对于每个索引中的项目,它会返回到早期索引中的项目,并检查是否应将其放在它们之前。如果是这样的话,它会用更大的值交换指数,直到它进入它应该拥有的指数

下面是一些注释代码,希望对您有所帮助

function insertionSort() {
    /* Set up local vars */
    var temp, inner;
    /* Start at index 1, execute outer loop once per index from 1 to the last index */
    for (var outer = 1; outer <= this.dataStore.length - 1; ++outer) {
        /* Store the value at the current index */
        temp = this.dataStore[outer];
        /* Set up temporary index to decrement until we find where this value should be */
        inner = outer;
        /* As long as 'inner' is not the first index, and 
        there is an item in our array whose index is less than 
        inner, but whose value is greater than our temp value... */ 
        while (inner > 0 && (this.dataStore[inner-1] >= temp)) {
            /* Swap the value at inner with the larger value */
            this.dataStore[inner] = this.dataStore[inner-1];
            /* Decrement inner to keep moving down the array */
            --inner;
        }
        /* Finish sorting this value */
        this.dataStore[inner] = temp;
    }
    console.log(this.toString());
}
函数插入排序(){
/*设置本地变量*/
变量温度,内部;
/*从索引1开始,从1到最后一个索引,每个索引执行一次外部循环*/
对于(var outer=1;outer 0&&(this.dataStore[inner-1]>=temp)){
/*将内部的值与较大的值交换*/
this.dataStore[inner]=this.dataStore[inner-1];
/*递减内部以保持阵列向下移动*/
--内在的;
}
/*完成对该值的排序*/
this.dataStore[inner]=temp;
}
console.log(this.toString());
}


这是一个包含大量控制台打印输出的示例,您可以一步一步地浏览它,看看每一步会发生什么。

插入排序背后的主要概念是通过比较对元素进行排序

在您的例子中,比较发生在
数据存储
数组中,该数组包含我们假设为可比较的元素,如数字

为了逐个元素进行比较,此插入排序算法从
数据存储
数组的开头开始,并将继续运行,直到到达数组的结尾。这是通过
for
循环实现的:

for (var outer = 1; outer <= this.dataStore.length - 1; ++outer)
for(var outer=1;outer 0&&(this.dataStore[inner-1]>=temp))

这告诉您,只要
数据存储
数组中所有先前访问的元素大于或等于
temp
,我们的临时变量就用于存储当前元素;我们想交换这些值

交换它们将完成以下任务:

  • 假设此.dataStore[inner]之前的所有元素都大于10,并且当前访问的元素
    this.dataStore[inner]
    等于5。这在逻辑上意味着5需要位于数组的开头。在这种情况下,由于while循环,我们将继续向下传递5到this.datastore[0]。从而使5成为数组中的第一个元素
在交换结束时,
temp
中的值根据我们在数组中的当前位置放置,只是为了提醒您这是哪个位置,它存储了变量
outer


TLDR:我也喜欢贾斯汀·鲍威尔的答案,因为它符合代码,但我认为根据你的理解水平,走查会更有用。我希望有帮助

从内部循环开始检查当前元素是否大于上一个元素如果是,则退出循环,因为所有元素都是为迭代排序的,如果不是交换元素,则因为当前元素小于上一个元素,所以需要向左移动。内部循环确保交换元素,直到遇到一个排序的元素,该元素导致中断退出循环

交换发生后,减少外部索引(i),因为要向下检查即将到来的元素是否小于上一个元素,所以不能保持外部索引(i)静态

最后,memIndex变量用作重置索引,因为在内部循环结束时,您希望移动到下一个索引。索引(i)应始终放置在排序数组的最后一个元素,以便内部循环可以再次开始比较

函数插入排序(arr){
设memIndex=0
for(设i=0;i=0;--j){
如果(arr[j]>=arr[i]){
打破
}
if(arr[j]
const insertionSort=array=>{
const arr=Array.from(Array);//避免副作用
for(设i=1;i0&&arr[j]
您发现哪些部分令人困惑?请尝试使用其他插座来理解。也许一个更直观的例子会有所帮助。我发现这些视频有助于理解数据结构和算法,因为它们往往非常直观。另外,还有一个有用的网站有出色的交互式可视化@TylerDavis Hi。我读过关于插入排序算法的操作原理。我的问题是我不能理解代码。什么部分负责什么。但例如,当我学习关于二叉树的章节时,我在理解上没有类似的问题。@Mikhail,我在我的答案中添加了一个JSFIDLE片段。打开浏览器的控制台并运行代码,可能会对您有所帮助。