冒泡排序的原理:不断比较相邻元素,如果前一个比后一个大,就元素交换,直到没有需要比较的元素。
function bubbleSort(arr) {
let len = arr.length;
if(len >= 1) {
for(let i = 0;i < len - 1; i++) {
for(let j = 0;j < len - 1 - i; j++) {
if(arr[j] > arr[j + 1]) {
let temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
}
return arr;
}
优化后的
function bubbleSort(arr) {
let len = arr.length;
let lastExchangeIndex = 0;
//无序数列的边界,每次比较只需要比到这里为止
let sortBorder = len - 1;
if(len >= 1) {
for(let i = 0;i < len; i++) {
//有序标记,每一轮的初始是true
let isSorted = true;
for(let j = 0;j < sortBorder - i; j++) {
if(arr[j] > arr[j + 1]) {
let temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
//有元素交换,所以不是有序,标记变为false
isSorted = false;
//把无序数列的边界更新为最后一次交换元素的位置
lastExchangeIndex = j;
}
}
sortBorder = lastExchangeIndex;
if(isSorted) { //有序,跳出循环
break;
}
}
}
return arr;
}
选择排序的原理:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
function selectSort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { //寻找最小的数
minIndex = j; //将最小数的索引保存
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
快速排序的原理:在数组中找到基准点(比如中间位置的数字),其他数与之比较,新建两个数组,小于基准点的数存储在左边数组,大于基准点的数存储在右边数组,拼接数组,然后左边数组与右边数组继续比较存储,直到最后完成数组排序。
function quickSort(arr){
if(arr.length<=1){
return arr // 如果数组长度小于或等于1,则直接返回数组
}
// 找到数组中间的索引,如果是浮点数,则向下取整
var num = Math.floor(arr.length/2);
var centerVal = arr.splice(num,1); // 找到数组中间索引的值
var left = [];
var right = [];
for(var i=0;i<arr.length;i++){
if(arr[i]<centerVal){
left.push(arr[i]) // 基准点左边的数放到左边数组
}else{
right.push(arr[i]) // 基准点右边的数放到右边数组
}
} // 利用concat拼接数组,并调用sort方法
return sort(left).concat([centerVal],sort(right))
}
网友评论