一.希尔排序
1.基本思想:
将相距某个“增量”记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。
function ShellSort(arr){
var i,j;
var increment=arr.length; //初始化增量为数组长度
do{
increment=Math.floor(increment/3)+1; //取增量
for(var i=increment+1;i<arr.length;i++){ //将相隔增量的记录作为一个子序列进行排序
if(arr[i]<arr[i-increment]){ //若增量后面的数小于增量前的数
var temp=arr[i]; //先将后面数保存
for(var j=i-increment;j>0&&temp<arr[j];j-=increment) //遍历该数前以增量组成的子序列
arr[j+increment]=arr[j]; //把该子序列排序
arr[j+increment]=temp; //把temp插入子序列中空出的位置上
}
}
}while(increment>1); //增量变小且大于1
return arr;
}
2.复杂度分析
将相隔某个增量的继续组成一个子序列,实现跳跃式的移动,使得排序的效率提高。
时间复杂度为:O(n^3/2),它不是一种稳定的算法。
二.快速排序
1.基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
function quickSort(arr){
//如果数组<=1,则直接返回
if(arr.length<=1){return arr;}
var pivotIndex=Math.floor(arr.length/2);
//找基准,并把基准从原数组删除
var pivot=arr.splice(pivotIndex,1)[0];
//定义左右数组
var left=[];
var right=[];
//比基准小的放在left,比基准大的放在right
for(var i=0;i<arr.length;i++){
if(arr[i]<=pivot){
left.push(arr[i]);
}
else{
right.push(arr[i]);
}
}
//递归
return quickSort(left).concat([pivot],quickSort(right));
}
2.复杂度分析
最好情况:O(nlogn);
最坏情况:O(n^2);