目录
1、快速排序
数组值:
var arr = [12,23,54,34,12,2,34,53,1,32,4,24,21,90];
原理动态图:
实现思想:
数组二分法和递归调用
实现步骤:
(1)在数据集之中,找一个基准点
(2)以基准点为大小建立两个数组。分别左边数组存储比基准点小的数,右边数组存储比基准点大的数。
(3)利用递归进行循环比较
var arr = [12,23,54,34,12,2,34,53,1,32,4,24,21,90];
function quickSort(obj){
if (obj.length<=1) {
//如果数组只有一个数,就直接返回;
return obj;
}
//中间数的索引值,如果是浮点数,则向下取整
var centerIndex = Math.floor(obj.length/2);
//中间值
var indexValue = obj.splice(centerIndex,1);
var leftArr = [];
var rightArr = [];
var calculation = 0;//总共执行次数
for(var i = 0; i < obj.length; i++){
if (indexValue>obj[i]) {
//基准点的左边的数传到左边数组
leftArr.push(obj[i]);
}else{
//基准点的右边的数传到右边数组
rightArr.push(obj[i]);
}
}
//递归不断重复比较
return quickSort(leftArr).concat([indexValue],quickSort(rightArr));
}
console.log(quickSort(arr).toString());
//1,2,4,12,12,21,23,24,32,34,34,53,54,90
2、冒泡排序
原理动态图:
实现思路:
两层循环对比交换位置
实现步骤:
(1) 外层for循环遍历元素,下标为:i。
(2)内层for循环负责移动索引进行比较。内层索引从j= i +1开始,直到数组末尾,对比arr[i]与a[j]大小,a[i]>a[j]交换彼此位置。
(3)循环遍历直到结束
function bubbleSort(obj){
for(var i = 0, len = obj.length; i < len; i++){
for(var j = i+1; j < len; j++){
if (obj[i]>obj[j]) {
var temp = obj[i];
obj[i] = obj[j];
obj[j] = temp;
}
}
}
return obj;
}
console.log(bubbleSort(arr));
//(14) [1, 2, 4, 12, 12, 21, 23, 24, 32, 34, 34, 53, 54, 90]
3、插入排序
实现原理图
实现思想:
从第二个位置开始循环依次和之前位置的值比较
实现步骤:
(1)当前值(current)从第二位置开始循环数组
(2)依次和它(current)前面的位置(preIndex)比较大小,前面的位置值(arr[preIndex])大,交换位置
function insertSort(obj){
var preIndex,current;
for(var i = 1; i < obj.length; i++){
preIndex = i - 1;
current = obj[i];
while(preIndex>=0 && obj[preIndex]>current){
obj[preIndex+1] = obj[preIndex];
preIndex--;
}
obj[preIndex+1] = current;
}
return obj;
}
console.log(insertSort(arr));
//(14) [1, 2, 4, 12, 12, 21, 23, 24, 32, 34, 34, 53, 54, 90]
3、arr.sort([sortby])方法排序
实现思想
sort说明
(1)如果调用sort()方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
(2)如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
- <1>若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
- <2>若 a 等于 b,则返回 0。
- <3>若 a 大于 b,则返回一个大于 0 的值。
实现步骤
var arr = [43, 5, 7, 43, 28, 986, 4, 1,1,2,5,7];
arr.sort(function(a, b) {
return a - b;
});
arr.sort((a, b) => a - b);//和上面的效果一样
console.log(arr);//(12) [1, 1, 2, 4, 5, 5, 7, 7, 28, 43, 43, 986]
4、选择排序
选择排序是表现最稳定的排序算法之一 ,因为无论什么数据进去都是O(n2)的时间复杂度 ,所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。理论上讲,选择排序可能也是平时排序一般人想到的最多的排序方法了吧。
选择排序(Selection-sort) 是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
4.1、代码实现
1、算法描述
-
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
-
再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
-
重复第二步,直到所有元素均排序完毕。
2.2 动图演示
/**
* 选择排序
* @param array
* @return
*/
function selectionSort(array) {
if (array.length == 0)
return array;
for (int i = 0; i < array.length; i++) {
int minIndex = i;
for (int j = i; j < array.length; j++) {
if (array[j] < array[minIndex]) //找到最小的数
minIndex = j; //将最小数的索引保存
}
int temp = array[minIndex];
array[minIndex] = array[i];
array[i] = temp;
}
return array;
}