https://blog.csdn.net/a3192048/article/details/80269862
- 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序或并归排序。
- 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的时间最短。
- 算法效率比较
1. 插入排序—直接插入排序
基本思想:
将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。
要点:设立哨兵,作为临时存储和判断数组边界之用。
直接插入排序示例:
如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。
算法实现
function insertSort(arr) {
console.log("原始数组:" + arr);
var lens = arr.length;
for(let i=1;i<lens;i++) {
for(let j=0;j<i;j++) { //与前面的i项序列进行排序
if(arr[i] < arr[j]) { //比原始项小则插入到之前
arr.splice(j,0,arr[i]);
arr.splice(i+1,1); //将原始项删除
break
}
}
console.log("第" + i + "次: " + arr);
}
}
其中关于splice的用法:
- 使用 splice() 来删除元素
通过参数设定,您能够使用 splice() 在数组中不留“空洞”的情况下移除元素。
第一个参数(0)定义新元素应该被添加(接入)的位置。
第二个参数(1)定义应该删除多个元素。
其余参数被省略。没有新元素将被添加 - 第一个参数(2)定义了应添加新元素的位置(拼接)。
第二个参数(0)定义应删除多少元素。
其余参数(“第三个参数”,“第四个参数” …)定义要添加的新元素。
测试案例
var arr = [49, 38, 65, 97, 76, 13, 27, 49];
insertSort(arr);
结果输出
交换排序——快速排序
基本思想:
- 选择一个基准元素,通常选择第一个元素或者最后一个元素,
- 通过一趟排序,将待排序的记录分割成独立的两个部分,其中一部分记录的元素值均比基准元素值小。另一部分的记录的元素值都比基准值大。
- 此时基准元素在排好序的正确位置
- 然后分别对这两部分记录用同样的方法进行排序,直到整个序列都有序
快速排序实例:
过程如下:
- 实现方法——挖坑法
function QuickSort(arr) {
if(arr.length < 2) {
return arr;
} else {
var pivotkey = arr[0]; //将pivotkey提取出来
var j = arr.length-1
var i = 0;
while(i < j) {
if(arr[j] < pivotkey) { //先从左边往右边遍历,找到第一个小于pivotkey的值
arr[i] = arr[j];
for(i=i+1; i<j; i++) {//从又往左找第一个大于pivotkey的值
if(arr[i] > pivotkey) {
arr[j] = arr[i];
break
}
}
} else {
j--;
}
}
arr[i] = pivotkey;
}
var left = QuickSort(arr.slice(0,i));
var right = QuickSort(arr.slice(i+1,arr.length));
left.push(pivotkey);
return left.concat(right)
}
const arr = [49, 43, 65, 97, 76, 13, 27];
console.log(QuickSort(arr));//[13, 27, 43, 49, 65, 76, 97]