1.冒泡排序
冒泡排序法又称为交换排序法,是从观察水中气泡变化构思而成。原理是从第一个元素开始,比较相邻元素的大小,若大小顺序有误,则对调后再进行下一个元素的比较。如此经过第一次扫描后就可以确保最后一个元素位于正确的顺序;经过第二次扫描可以确保倒数第二个元素位于正确的顺序。由此可知,N个元素经过(N-1)次扫描,就可以完成所有元素的排序。
程序实现:由小到大排序
var arr = [9, 1, 4, 3, 5, 2, 7, 8, 6, 6];
console.time();
console.log(mao_sort(arr));
console.timeEnd();
function mao_sort(num) {
if (num.length <= 1) {
return;
}
var temp = null;
for (var i = 0; i < num.length; i++) {
for (var k = 0; k < num.length - i - 1; k++) {
if (num[k] < num[k + 1]) {
temp = num[k];
num[k] = num[k + 1];
num[k + 1] = temp;
}
}
}
return num;
}
2.快速排序(二分法)
快速排序(Quick Sort)是由C.A.Hoare所提出来的。快速排序法又称分割交换排序法,是目前公认最佳的排序法,也是使用“分而治之”(Divide and Conquer)的方式,先在数据中找到一个虚拟的中间值,并按此中间值将所有打算排序的数据分为两部分。其中,小于中间值的数据放在左边,大于中间值的数据放在右边,再以同样的方式分别处理左、右两边的数据,直到排序完为止。
快速排序的步骤:
(1) 选择基准值。
(2) 将数组分成两个子数组:小于基准值的元素和大于基准值的元素。
(3) 对这两个子数组进行快速排序。
算法简单描述:选择数组第一位元素位基准值,创建两个新数组,分别存放小于基准值和大于基准值的元素。然后这两个新数组递归进行上述操作,直到数组为空。然后将左右数组和基准值进行拼接。
代码实现
var arr = [9, 1, 4, 3, 5, 2, 7, 8, 6, 6];
console.time();
console.log(quicksort(arr));
console.timeEnd();
function quicksort(num) {
if (num.length <= 1) {
return num;
}
//中间索引
var centerindex = parseInt(num.length / 2);//引用类型转换为值类型
var centernum=num.splice(centerindex,1);
var left=[];
var right=[];
for(var i=0;i<num.length;i++)
{
if(num[i]>centernum)
{
//左边
left.push(num[i]);
}
else{
//右边
right.push(num[i]);
}
}
return quicksort(left).concat(centernum).concat(quicksort(right));
}
3.插入排序
插入排序法(Insert Sort)是将数组中的元素,逐一与已排序好的数据进行比较,前两个元素先排好,再将第三个元素插入适当的位置,所以这三个元素仍然是已排好序的,接着将第四个元素加入,重复此步骤,直到排序完成为止。可以看作是在一串有序的记录R1、R2…Ri中,插入新的记录R,使得i+1个记录排序妥当。
var arr = [9, 1, 4, 3, 5, 2, 7, 8, 6, 6];
console.log(quicksort(arr));
console.timeEnd();
function quicksort(num) {
if (num.length <= 1) {
return num;
}
for (var i = 1; i < num.length; i++) {
//拿
// 边的一个 跟前面的所有比对 》 《 交换位置
var nowdata = num[i];//4
var before = i - 1;//前面的索引 1
while (nowdata > num[before] && before >= 0) {
num[before + 1] = num[before];//9143
before--;
}
num[before + 1] = nowdata;
}
return num;
}
4.选择排序
选择排序法(Selecting Sort)也算是枚举法的应用,就是反复从未排序的数列中取出最小的元素,加入到另一个数列中,最后的结果即为已排序的数列。从小到大排序的操作是一开始在所有的数据中挑选一个最小项放在第一个位置,再从第二项开始挑选剩下元素的最小项放在第2个位置,以此反复,直到完成排序为止。由此可知,N个元素经过(N-1)次扫描,就可以完成所有元素的排序。
var arr = [9, 1, 4, 3, 5, 2, 7, 8, 6, 6];
console.time();
console.log(selectSort(arr));
function selectSort(num) {
if (num.length <= 1) {
return;
}
for (var i = 0; i < num.length; i++) {
//记录初始值
var temp = i;
var t = null;
for (var k = i; k < num.length; k++) {
if (num[k] < num[temp]) {
temp = k;
}
}
//交换位置
t = num[temp];
num[temp] = num[i];
num[i] = t;
}
return num;
}
console.timeEnd()