js插入排序
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5。
动态演示
代码实现
let array = randomArray(1, 100); console.log(array); let sortArray = insertionSort(array); console.log(sortArray); function insertionSort(array) { for (let begin = 1;begin < array.length;begin++) { let current = begin; while(current > 0 && array[current] < array[current - 1]){ [array[current], array[current - 1]] = [array[current - 1], array[current]]; current-- } } return array; } function randomArray(start,end){ var a=[],o={},random,step=end-start; while(a.length<step){ random=start+parseInt(Math.random()*step); if(!o["x"+random]){ a.push(random); o["x"+random]=1; }; }; return a; };
运行结果
优化一
//插入排序优化一 移位,减少交换值的操作 function insertionSort1(array) { for (let begin = 1;begin < array.length;begin++) { let cur = begin; let v = array[cur]; while(cur > 0 && v < array[cur -1]){ array[cur] = array[cur - 1]; cur--; } array[cur] = v; } return array; }
优化二
//插入排序优化二 通过二分法 function insertionSort2(array) { for (let i = 0;i < array.length;i++) { let insertIndex = search(array, i); let cur = array[i]; for (let j = i;j > insertIndex;j--) { array[j] = array[j-1]; } array[insertIndex] = cur; } }
//查找要插入的index值 function search(array, index) { let begin = 0; let end = index; while(begin < end) { let mid = (begin + end) >> 1; if(array[index] < array[mid]) { end = mid; }else{ begin = mid + 1; } } return begin; }
如果我的内容能对你有所帮助,我就很开心啦!