1冒泡排序:
没什么好说的,就是循环两次,两两比较,先找到一个最大或最小的值,再找剩余最大或最小的值,直到循环到最后;
先写几个公用方法:
/**
* 数组初始化-随机数
*/
function fnGetRandomArr(arrLength){
var randomArr=[];
for(var i=0;i<arrLength;i++){
randomArr[i]=Math.floor(Math.random()*(arrLength+1));
}
return randomArr;
}
/**
* 打印结果
* @param {Object} arr
*/
function toString(arr){
var restr="";
for(var i=0;i<arr.length;i++){
restr+=arr[i]+' ';
if(i>0&&i%10==0){
restr+='\n';
}
}
return restr;
}
/**
* 数组位置数值交换
* @param {Object} arr
* @param {Object} index1
* @param {Object} index2
*/
function swap(arr,index1,index2){
var temp=arr[index1];
arr[index1]=arr[index2];
arr[index2]=temp;
}
冒泡排序:
var count=1;
/**
* 冒泡排序
* @param {Object} dataStore
*/
function fnBubbleSort(dataStore){
var length=dataStore.length;
for(var outer=0;outer<length-1;outer++){
for(var inner=outer+1;inner<length;inner++){
if(dataStore[outer]>dataStore[inner]){
count++;//互换次数
swap(dataStore,outer,inner);
}
}
}
}
结果:
结论:性能很一般;
2 选择排序;
从冒泡排序的结果来看,在整个执行过程中,数组的值会出现大量的交换,而这是比较消耗性能的;选择排序与冒泡排序方法差不多,区别在于,选择排序是找的最小值或者最大值后,直接将这个值放到合适的位置上,中间不对数组进行“交换操作”;
/**
* 选择排序
* @param {Object} dataStore
*/
function fnSelectionSort(dataStore){
var length=dataStore.length;
var min=0;
var temp=0;
for(var outer=0;outer<length-1;outer++){
temp=dataStore[outer];
min=outer;
for(var inner=outer+1;inner<length;inner++){
if(temp>dataStore[inner]){
temp=dataStore[inner];
min=inner;
}
}
if(outer!=min){
count++;
swap(dataStore,outer,min);
}
}
}
执行结果:
结论:可以看到"count"值明显小了一些;
3 插入排序:
插入排序类似于打扑克时,放牌的动作。先抓了“方块8”,然后是“红桃4”,然后是“梅花7”,我们会整理成“红桃4”、“梅花7”、“方块8”类似这样;
/**
* 插入排序
* @param {Object} dataStore
*/
function fnInsertonSort(dataStore){
var length=dataStore.length;
var min=0;
var temp=0;
for(var outer=1;outer<length;outer++){
temp=dataStore[outer];
min=outer;
while(min>0&&(dataStore[min-1]>=temp)){
dataStore[min]=dataStore[min-1];
min--;
}
dataStore[min]=temp;
}
}
执行结果:
4 希尔排序-插入排序升级版:
希尔排序可以理解为插入排序的一个高级版本;区别在于它会先比较“较远”的元素,然后在比较“较近”的元素;这样就会尽快让比较远的元素回到合适的位置;而这样做为什么就会提高效率,不妨拿支笔画一画好好感受感受;而每次比较多远的值比较合适,
大佬Sedgewick给过一个公式:
var N=arr.length;
var h=1;
while(h<N/3){
h=3*h+1;
}
//简化下来
h=(h-1)/3;
/**
* 希尔排序
*/
function fnShellSort(dataStore){
var N=dataStore.length;
var h=1;
while(h<N/3){
h=3*h+1;
}
while(h>=1){
for(var outer=0;outer<N;outer++){
for(var inner=outer;inner>=h&&dataStore[inner]<dataStore[inner-h];inner-=h){
count++;
swap(dataStore,inner,inner-h);
}
}
h=(h-1)/3
}
}
结果:
5 性能比较:
5.1冒泡排序:长度为1w的随机数据耗时大概是300ms;超过10w比较吃力;
5.2选择排序:长度为1w的随机数据耗时大概是70ms;长度10w的数组大概在6.3秒;
5.3插入排序:长度为1w的随机数据耗时大概是30ms;长度10w的数组大概在3.3秒;
5.4希尔排序:长度为1w的随机数据耗时大概是6ms;长度10w的数组大概在30ms;;长度100w的数组大概在340ms;
js 数组 自身的排序
长度为1w的随机数据耗时大概是13ms;长度10w的数组大概在65ms;;长度100w的数组大概在700ms;