前提准备
//自动生成数组的函数,n:整数个数,数字在l-r之间
function setData(n,l,r){
var dataStore = [];
for(var i=0;i<n;i++){
dataStore[i] = Math.floor(Math.random()*(r-l+1)+l);
}
return dataStore;
}
冒泡排序
最慢的 排序算法之一,但最容易实现
过程:依次比较相邻的两个数值,一趟之后将最大(小)的冒到最后
时间复杂度:O(n^2)
稳定性:稳定
function bubbleSort(arr){
var temp;
for(var i=0;i<arr.length;i++){
//注意这里是arr.length-i,每经过一趟,最大的就会沉到最后,之后就不需要对其进行比较了
for(var j=1;j<arr.length-i;j++){
if(arr[j] < arr[j-1]){
temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
}
return arr;
}
选择排序
过程:每次将第一个元素与其它元素相比,第一趟之后会把最小的放在开头,之后再依次与第二个元素相比,依次进行,当进行到数组的倒数第二个位置时结束
特点:每次内循环都将最小的值赋值到它正确的位置
时间复杂度:
稳定性:
function selectionSort(arr){
var temp;
//外层循环到倒数第二个结束
for(var i=0;i<arr.length-1;i++){
//内存循环从第二个开始
for(var j=i+1;j<arr.length;j++){
if(arr[j] < arr[i]){
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
return arr;
}
插入排序
在一个有序的数组中,将一个数字插入到它合适的位置
过程:外层循环从第二个位置开始,并将其值赋值给temp,内存循环从外层循环的前一个位置开始,一直到第一个位置,
如果外层循环的值比temp大,则数组向右移动,将此时的外层循环的位置插入temp
注意:插入排序的运行并非通过数据交换,而是通过将较大的数组元素移动到右侧,为数组左侧的较小元素腾出位置
时间复杂度:
稳定性:
function insertSort(arr){
for(var i=1;i<arr.length;i++){
//每次将外层循环赋值给temp
var temp = arr[i];
for(var j=i-1;j>=0;j--){
if(arr[j] > temp){
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
时间复杂度可稳定性最后再总结