{"id":18772783,"url":"https://github.com/selvin11/algorithm","last_synced_at":"2025-10-28T15:11:34.954Z","repository":{"id":112796752,"uuid":"84640989","full_name":"Selvin11/algorithm","owner":"Selvin11","description":"algorithm by javascript","archived":false,"fork":false,"pushed_at":"2017-04-21T09:04:39.000Z","size":9,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-21T01:37:50.164Z","etag":null,"topics":["algorithm","javascript"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Selvin11.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-03-11T10:12:23.000Z","updated_at":"2017-03-11T10:12:37.000Z","dependencies_parsed_at":"2023-09-15T08:33:39.483Z","dependency_job_id":null,"html_url":"https://github.com/Selvin11/algorithm","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Selvin11/algorithm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Selvin11%2Falgorithm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Selvin11%2Falgorithm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Selvin11%2Falgorithm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Selvin11%2Falgorithm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Selvin11","download_url":"https://codeload.github.com/Selvin11/algorithm/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Selvin11%2Falgorithm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281458920,"owners_count":26505052,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-28T02:00:06.022Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["algorithm","javascript"],"created_at":"2024-11-07T19:30:19.527Z","updated_at":"2025-10-28T15:11:34.917Z","avatar_url":"https://github.com/Selvin11.png","language":null,"readme":"\n1. [插入排序](#1)\n2. [归并排序](#2)\n3. [冒泡排序](#3)\n4. [选择排序](#4)\n\n\u003ch3 id=\"1\"\u003e1. 插入排序\u003c/h3\u003e\n\n  ```javascript \n    for (var j = 1; j \u003c arr.length; j++){\n        var key = arr[j]; // 从第二个开始，与前面一个比较大小\n        var i = j - 1;\n        while (i \u003e= 0 \u0026\u0026 arr[i] \u003e key){\n            arr[i+1] = arr[i];\n            i = i - 1;\n        }\n        arr[i+1] = key; // 如果前者比后者小，则不变\n    }\n  ```\n\n\n\u003ch3 id=\"2\"\u003e2. 归并排序\u003c/h3\u003e\n\n  ```javascript \n   /**\n     * 原数组：arr = [start,end] \n     * middle：数组一分为二的位置\n     */\n    function merge(arr, start, middle, end) {\n    // 将数组分为两组，假设每组以从小至大排序，开始比较两组中的第一项\n    // 将相对较小的付给空数组的第一项，然后将较小的数组的第二项继续与另一数组比较\n    // 重复上述步骤\n        // 将数组一份为二\n        var n1 = middle - start + 1, // 左边数组的长度\n            n2 = end - middle; // 右边数组的长度\n\n        var left = [], // 左边的数组\n            right = []; // 右边的数组\n\n        // 从arr中赋值给left\n        for (let i = 0; i \u003c n1; i++) {\n          left[i] = arr[start + i];\n        }\n        // 从arr中赋值给right\n        for (let j = 0; j \u003c n2; j++) {\n          right[j] = arr[middle + j + 1];\n        }\n\n        // !!!! 数组从零开始的，初始已经+1，因此这里的哨兵直接赋值给最后一个元素即可\n        left[n1] = Number.POSITIVE_INFINITY;\n        right[n2] = Number.POSITIVE_INFINITY;\n\n        let l = 0, r = 0;\n        for (let k = start; k \u003c= end; k++) {\n          \n          // 从两个数组的第一项开始比较\n          if (left[l] \u003c= right[r]) {\n            arr[k] = left[l];\n            l = l + 1;\n\n          }else{\n            arr[k] = right[r];\n            r = r + 1;\n          }\n          \n        }\n    }\n    \n    function merge_sort(arr,start,end) {\n        // 保证数组长度 \u003e 1\n        if (start + 1 \u003c end) {\n          var middle = Math.floor((start + end)/2);\n          merge_sort(arr,start,middle);\n          merge_sort(arr,middle+1,end);\n          merge(arr,start,middle,end);\n        }\n    }\n    \n    // example\n    merge_sort([1,2,4,2,5],0,4);\n  ```\n\n\n\u003ch3 id=\"3\"\u003e3. 冒泡排序\u003c/h3\u003e\n\n\n\n```javascript\nfunction bubbleSort(arr) {\n    console.time('冒泡排序耗时');\n    for (var i = 0; i \u003c arr.length; i++) {\n        // 从第一个数开始依次向右比较大小，比较arr.length次\n        for (var j = 0; j \u003c arr.length - 1 - i; j++) {\n          // 依次比较，比较arr.length - 1 -i()\n          // 减 1 是因为两两比较，比较次数会因为没有自我比较少一次\n          // 减 i 是因为每一轮比较完之后，最后一个值就是当前最大的，因此不用参与比较\n          // 前者比后者大则交换数值\n            if (arr[j] \u003e arr[j + 1]) {\n                var small = arr[j + 1];\n                arr[j + 1] = arr[j];\n                arr[j] = small;\n                arrState.push(deepCopy(arr));\n            }\n        }\n    }\n    console.timeEnd('冒泡排序耗时');\n    return arr;\n}\n// 改进版，增加pos参数记录每次轮询排序之后最后交换的位置索引\nfunction bubbleSort(arr){\n  var i = arr.length - 1; \n  while (i \u003e 0){\n    var pos = 0; // 每次轮询排序均从起始位置开始\n    for(var j = 0; j \u003c i; j++){\n      if(arr[j]\u003earr[j+1]){\n        pos = j; // 前者比后者大，进行位置交换，并记录该值\n        var key = arr[j];\n        arr[j] = arr[j+1];\n        arr[j+1] = key;  \n      }\n    }\n    i = pos;\n  }\n  return arr;\n}\n```\n\n\n\u003ch3 id=\"4\"\u003e4. 选择排序\u003c/h3\u003e\n\n\n\n```javascript\nfunction selectionSort(arr) {\n  // 原数组称为无序区，排序之后的称为有序区 temp\n  // 从原数组轮询，查出每次最小（大）值，与有序区首位进行交换，轮询加1\n  // 无序区记录减一，有序区记录加一\n  var len = arr.length;\n  var minIndex, temp;\n  console.time('选择排序耗时');\n  for (var i = 0; i \u003c len - 1; i++) {\n    minIndex = i;\n    for (var j = i + 1; j \u003c len; j++) {\n      if (arr[j] \u003c arr[minIndex]) {     //寻找最小的数\n        minIndex = j;                 //将最小数的索引保存\n      }\n    }\n    temp = arr[i];\n    arr[i] = arr[minIndex];\n    arr[minIndex] = temp;\n    arrState.push(deepCopy(arr));\n  }\n  console.timeEnd('选择排序耗时');\n  return arr;\n}\n```","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fselvin11%2Falgorithm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fselvin11%2Falgorithm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fselvin11%2Falgorithm/lists"}