相关链接:视觉算法——以动态图的方式来展示算法的实现过程
1.冒泡排序
原理:先找出当前数组中最大
的那个放到最后
步骤: 比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个 数据交换。
这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
N=N-1,如果N不为0就重复前面二步,否则排序完成。
function bubbleSort(arr) {
for (var i = 0; i < arr.length - 1; i++) {
for (var j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
console.log(bubbleSort([6, 1, 2, 4, 3, 5])) //1,2,3,4,5,6
2. 选择排序
原理:每次循环选出最小
的放在前面
步骤:在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换……第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。
function selectSort(arr) {
var min, temp;
for (var i = 0; i < arr.length - 1; i++) {
min = i;
for (var j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
return arr;
}
console.log(selectSort([6, 1, 2, 4, 3, 5])) //1,2,3,4,5,6
3. 快速排序
原理:就是一开始选择当前数组的中中间,比中间的数的大的放到右边的数组,比它小的放到左边,不断递归,直到当前只有一个数
步骤:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
function quickSort(arr) {
if (arr.length < 2) { return arr }
var left = [], right = [], mid = arr.splice(Math.floor(arr.length / 2), 1);
for (var i = 0; i < arr.length; i++) {
if (arr[i] < mid) {
left.push(arr[i]);
} else {
right.push(arr[i])
}
}
return quickSort(left).concat(mid, quickSort(right))
}
console.log(quickSort([6, 1, 2, 4, 3, 5])) //1,2,3,4,5,6
4. 插入排序
原理:
- 选择一个数与这个数前面的数就行比较,开始时选择序号为1的,以后循环依次往后选
- 然后将选择的数与前面的数进行比较,比前面的数小,就交换两者位置
- 继续向前找,直到找到第一个比选择的数小的,就把选择的这个数放到那个较小数的后一位,然后依次类推的进行1,2,3的步骤
function insertSort(arr) {
var len = arr.length;
for (var i = 1; i < len; i++) {
var key = arr[i];
var j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
return arr;
}
console.log(insertSort([1,2,5,19,3])) //1,2,3,5,19
5. 数组的sort方法
// 1.如果调用该方法时没有使用参数,使用ascii码进行对比
var arr = ['General','Tom','Tam','John','Army'];
var resArr = arr.sort();
console.log(resArr);//输出 ["Army", "General", "John", "Tam", "Tom"]
var arr2 = [30, 10, 111, 35, 1899, 50, 45];
var resArr2 = arr2.sort();
console.log(resArr2);//输出 [10, 111, 1899, 30, 35, 45, 50]
// 如果想按照其他规则进行排序,就需要提供比较函数,该函数要比较两个值
// 2.a-b 升序
var arr3 = [30,10,111,35,1899,50,45];
arr3.sort(function(a,b){
return a - b;
})
console.log(arr3);//输出 [10, 30, 35, 45, 50, 111, 1899]
// 3.b-a 降序
var arr4 = [30,10,111,35,1899,50,45];
arr4.sort(function(a,b){
return b - a;
})
console.log(arr4);//输出 [1899, 111, 50, 45, 35, 30, 10]
// 4.根据数组中的对象的某个属性值排序
var arr5 = [{id:10},{id:5},{id:6},{id:9},{id:2},{id:3}];
arr5.sort(function(a,b){
return a.id - b.id
})
console.log(arr5);
//输出新的排序
// {id: 2}
// {id: 3}
// {id: 5}
// {id: 6}
// {id: 9}
// {id: 10}
// 4.根据数组中的对象的多个属性值排序,多条件排序;
var arr6 = [{id:10,age:2},{id:5,age:4},{id:6,age:10},{id:9,age:6},{id:2,age:8},{id:10,age:9}];
arr6.sort(function(a,b){
if(a.id === b.id){//如果id相同,按照age的降序
return b.age - a.age
}else{
return a.id - b.id //不同时,按id进行升序排序
}
})
console.log(arr6);
//输出新的排序
// {id: 2, age: 8}
// {id: 5, age: 4}
// {id: 6, age: 10}
// {id: 9, age: 6}
// {id: 10, age: 9}
// {id: 10, age: 2}