js排序 希尔排序,快速排序

希尔排序:

定义一个间隔序列,例如是5,3,1。第一次处理,会处理所有间隔为5的,下一次会处理间隔为3的,最后一次处理间隔为1的元素。也就是相邻元素执行标准插入排序。

在开始最后一次处理时,大部分元素都将在正确的位置,算法就不必对很多元素进行交换,这是比插入元素高级的地方。

时间复杂度O(n*logn)
 
 1 function shellSort(){
 2     var N=arr.length;
 3     var h=1;
 4     while(h<N/3){
 5         h=3*h+1;//设置间隔
 6     }
 7     while(h>=1){
 8         for(var i=h; i<N; i++){
 9             for(j=i; j>=h && arr[j]<arr[j-h]; j-=h){
10                 swap(arr, j, j-h);
11             }
12         }
13         h=(h-1)/3;
14     }
15 }
16 function swap(array, i, j){//两个数调换
17     var temp =array[j];
18     array[j]=array[i];
19     array[i]=temp;
20 }

快速排序:

通过递归的方式将数据依次分解成包含较小元素和较大元素的不同子序列,不断重复这个步骤,直到所有数据都是有序的。

选一个基准值,小于基准值的放一个数组里面。大于基准值的放一个数组里面。

时间复杂度O(n*logn)
 1 function quickSort(arr){
 2 
 3     if(arr.length==0){
 4         return [];
 5     }
 6     var left=[];
 7     var right=[];
 8     var p=arr[0];
 9     for(var i=1; i<arr.length; i++){
10         if(arr[i]<p){
11             left.push(arr[i]);
12         }else{
13             right.push(arr[i]);
14         }
15     }
16     return quickSort(left).concat(p,quickSort(right));
17 }

快速排序适合用于大型数据集合,在处理小数据集合反而性能会下降。

原文地址:https://www.cnblogs.com/xxza/p/4680968.html