开门见山,算法三剑客即选择排序,冒泡排序和快速排序
一、选择排序
实现思路
- 数组的第一项和后边的所有项进行比较,比后一项大,交换位置
- 数组的第二项和后边的所有项进行比较,比后一项大,交换位置
- 数组中的每一项和后边的所有项进行比较,比后一项大,交换位置
var arr = [2,5,1,8,6,4,3,9,7];
// 遍历数组
// 外循环控制比较项
for(var i = 0; i<arr.length; i++){
// arr[i]-比较项
// 内循环控制后边的所有项
for(var j = i+1; j<arr.length; j++){
if( arr[i] > arr[j] ){
// 交换位置
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
console.log(arr);//[1, 2, 3, 4, 5, 6, 7, 8, 9]
二、冒泡排序
实现思路
- 从第一项开始,比较相邻位置的两项,前边比后一项大,交换位置
- 有多少个元素,执行多少轮比较
var arr = [2,5,1,8,6,4,3,9,7];
// 外循环只是控制比较次数
for(var i = 0; i<arr.length; i++){
// 内循环控制相邻元素比较
// 优化:每轮比较时,最大值都放在最后,下一轮比较时,没有必要和最后的元素作比较
for(var j = 0; j<arr.length-i; j++){
// 比较相邻位置的
if( arr[j] > arr[j+1] ){
var temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
// 一轮比较结束后,获得本轮循环的最大值
}
console.log(arr);//[1, 2, 3, 4, 5, 6, 7, 8, 9]
三、快速排序(用递归实现)
实现思路
- 数组中间位置的元素提取出来(丛数组里删掉 splice)
- 声明两个空数组 left right
- 所有元素和中间值比较,比中间值小的放left中,比中间值大放right中
- 把left 中间值 right组成一个数组,完成了一次排序(concat)
- left和right 重复上述操作(递归-函数内部调用自己这个函数),直到数组中有一个或没有元素停止(递归一定要跳出循环,否则会死循环)
var arr = [2,5,1,8,6,4,3,9,7];
function quickSort(arr){
// 结束条件
if(arr.length <= 1){
return arr;
}
// 提取中间元素 splice
var middle = arr.splice(parseInt(arr.length/2), 1)[0];
// 声明两个空数组
var left = [], right = [];
// 所有元素和中间值比较
for(var i = 0; i<arr.length; i++){
if( arr[i] > middle ){
// 比中间位置大,放在right数组
right.push( arr[i] );
}else{
// 比中间值小的放left中
left.push( arr[i] );
}
}
// 左右数组重复上述操作
// 组合成为一个新数组
return quickSort(left).concat(middle, quickSort(right));
}
console.log(quickSort(arr));//[1, 2, 3, 4, 5, 6, 7, 8, 9]
目前只会这三,一起学习吧~