JS数组多条件排序基于Array.sort()方法,首先要了解sort()方法的用法。
sort()方法可以传入一个函数作为参数,然后依据该函数的逻辑,进行数组的排序。
eg:
sort()方法接收函数作为参数时,排序主要根据传入函数的返回值是否大于0进行排序。
1)当 a-b <0时,则a元素排在b元素的前面;(a、b元素位置不变)
2)当a-b= 0时,a,b元素的位置不变;
3)当a-b >0时,则b元素排在a元素的前面。(a、b元素位置交换)
当数组元素为对象时,若要根据对象的多个属性进行排序,就涉及到多条件排序。
从给定的数据中,随机抽出一项,这项的左边放所有比它小的,右边放比它大的,然后再分别这两边执行上述操作,采用的是递归的思想,总结出来就是 实现一层,分别给两边递归,设置好出口
function fastSort(array,head,tail){//考虑到给每个分区操作的时候都是在原有的数组中进行操作的,所以这里head,tail来确定分片的位置
/*生成随机项*/
var randomnum = Math.floor(ranDom(head,tail))
var random = array[randomnum]
/*将小于random的项放置在其左边 策略就是通过一个临时的数组来储存分好区的结果,再到原数组中替换*/
var arrayTemp = []
var unshiftHead = 0
for(var i = headi <= taili++){
if(array[i]<random){
arrayTemp.unshift(array[i])
unshiftHead++
}else if(array[i]>random){
arrayTemp.push(array[i])
}
/*当它等于的时候放哪,这里我想选择放到队列的前面,也就是从unshift后的第一个位置放置*/
if(array[i]===random){
arrayTemp.splice(unshiftHead,0,array[i])
}
}
/*将对应项覆盖原来的记录*/
for(var j = head , u=0j <= tailj++,u++){
array.splice(j,1,arrayTemp[u])
}
/*寻找中间项所在的index*/
var nowIndex = array.indexOf(random)
/*设置出口,当要放进去的片段只有2项的时候就可以收工了*/
if(arrayTemp.length <= 2){
return
}
/*递归,同时应用其左右两个区域*/
fastSort(array,head,nowIndex)
fastSort(array,nowIndex+1,tail)
}
JavaScript实现多维数组、对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序。
sort() 方法用于对数组的元素进行排序。语法如下:
arrayObject.sort(sortby)例如:
function NumAscSort(a,b)
{
return a - b
}
function NumDescSort(a,b)
{
return b - a
}
var arr = new Array( 3600, 5010, 10100, 801)
arr.sort(NumDescSort)
alert(arr)
arr.sort(NumAscSort)
alert(arr)
//排序算法window.onload = function(){
var array = [0,1,2,44,4,
324,5,65,6,6,
34,4,5,6,2,
43,5,6,62,43,
5,1,4,51,56,
76,7,7,2,1,
45,4,6,7,8]
//var array = [4,2,5,1,0,3]
array = sorting.shellSort(array)
alert(array)
}
var sorting = {
//利用sort方法进行排序
systemSort: function(arr){
return arr.sort(function(a,b){
return a-b
})
},
//冒泡排序
bubbleSort: function(arr){
var len=arr.length, tmp
for(var i=0i<len-1i++){
for(var j=0j<len-1-ij++){
if(arr[j]>arr[j+1]){
tmp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = tmp
}
}
}
return arr
},
//快速排序
quickSort: function(arr){
var low=0, high=arr.length-1
sort(low,high)
function sort(low, high){
if(low<high){
var mid = (function(low, high){
var tmp = arr[low]
while(low<high){
while(low<high&&arr[high]>=tmp){
high--
}
arr[low] = arr[high]
while(low<high&&arr[low]<=tmp){
low++
}
arr[high] = arr[low]
}
arr[low] = tmp
return low
})(low, high)
sort(low, mid-1)
sort(mid+1,high)
}
}
return arr
},
//插入排序
insertSort: function(arr){
var len = arr.length
for(var i=1i<leni++){
var tmp = arr[i]
for(var j=i-1j>=0j--){
if(tmp<arr[j]){
arr[j+1] = arr[j]
}else{
arr[j+1] = tmp
break
}
}
}
return arr
},
//希尔排序
shellSort: function(arr){
console.log(arr)
var h = 1
while(h<=arr.length/3){
h = h*3+1 //O(n^(3/2))by Knuth,1973
}
for( h>=1h=Math.floor(h/3)){
for(var k=0k<hk++){
for(var i=h+ki<arr.lengthi+=h){
for(var j=ij>=h&&arr[j]<arr[j-h]j-=h){
var tmp = arr[j]
arr[j] = arr[j-h]
arr[j-h] = tmp
}
}
}
}
return arr
}
}