快速排序的平均效率是O(N * logN).
手撕鬼子开始~
1. 封装添加元素方法
ArrayList.prototype.insert=function(item){
this.array.push(item)
}
2. 封装交换位置方法
ArrayList.prototype.swap=function(m,n){
var temp = this.array[m]
this.array[m]=this.array[n]
this.array[n]= temp
}
3.封装选取枢纽方法
我们要选取一个枢纽 pivot
为了使我们节省内存空间 选取中位数
左大于右 交换
中间大于右 交换
此时还需要判断变化后的 左和中间位置 进行交换
ArrayList.prototype.point=function(left,right){
// 取中位数
var center = Math.floor((left+right)/2)
// 进行位置交换
if(this.array[left]>this.array[center]){
this.swap(left,center)
}
if(this.array[center]>this.array[right]){
this.swap(center,right)
}
if(this.array[left]>this.array[center]){
this.swap(left,center)
}
this.swap(center,right-1)
return this.array[right-1]
}
4.递归操作
ArrayList.prototype.quick=function(){
this.quickSort(0,this.array.length-1)
}
ArrayList.prototype.quickSort=function(left,right){
//判断递归结束条件
if(left>=right) return
//获取中位数 枢纽
var point =this.point(left,right)
//记录左右开始的位置
var i=left
var j=right-1
//循环判断开始
while(i<j){
while(this.array[++i]<point) { }
while(this.array[--j]>point) { }
//使用两个while循环
//递归的查找合适的i(大于枢纽的值)和合适的j(小于枢纽的值).
if(i<j){
this.swap(i,j)
}else{
break
}
}
//将枢纽放在正确的位置
this.swap(i,right-1)
//递归左半段 递归右半段
this.quickSort(left,i-1)
this.quickSort(i+1,right)
}
}