排序算法 | 平均狀況 | 最好狀況 | 最壞狀況 | 輔助空間 | 穩定性 |
---|---|---|---|---|---|
冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | 穩定 |
簡單選擇排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 穩定 |
直接插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | 穩定 |
希爾排序 | O(nlogn)~O(n^2) | O(n^1.3) | O(n^2) | O(1) | 不穩定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不穩定 |
歸併排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 穩定 |
快速排序 | O(nlogn) | O(nlogn) | O(n^2) | O(nlogn)~O(n) | 不穩定 |
簡單算法:冒泡、簡單選擇、直接插入
改進算法:希爾、堆、歸併、快速javascript
後三種改進算法比希爾算法效率高,但最好的狀況下,冒泡和直接插入最有效,所以若是數組基本有序,則須要考慮簡單算法java
1、分析算法
改進:爲了不已經有序的狀況下進行無心義的兩兩比較,用flag標誌上一趟是否有交換,沒有交換則已是有序數組,退出循環。shell
2、代碼數組
function bubbleSort(arr){ var flag=true; for(let i=0;i<arr.length&&flag;i++){ flag=false; for(let j=0;j<arr.length-i-1;j++){ if(arr[j]>arr[j+1]){ [arr[j],arr[j+1]]=[arr[j+1],arr[j]]; flag=true; } } } return arr; }
1、分析code
2、代碼排序
function selectSort(arr){ var min=0; for(let i=0;i<arr.length-1;i++){ for(let j=i+1;j<arr.length;j++){ if(arr[j]<arr[min]){ min=j; } } if(i!=min){ [arr[i],arr[min]]=[arr[min],arr[i]]; } } return arr; }
1、分析遞歸
2、代碼ip
function insertSort(arr){ for(let i=1;i<arr.length;i++){ let temp=arr[i]; let j=i-1; while(j>=0&&arr[j]>temp){ arr[j+1]=arr[j]; j--; } arr[j+1]=temp; } return arr; }
是一種改進版的插入排序,「縮小增量排序」。
1、分析rem
2、代碼
function shellSort(arr){ for(let increment=Math.floor(arr.length/2);increment>0;increment=Math.floor(increment/2)){ for(let i=increment;i<arr.length;i++){ let temp=arr[i]; let j=i-increment; while(j>=0&&arr[j]>temp){ arr[j+increment]=arr[j]; j-=increment; } arr[j+increment]=temp; } } return arr; }
1、分析
2、代碼
function heapSort(arr){ //1. 構造大頂堆 //2. 頂值最大,交換到最末尾 //3. 調整大頂堆 var len=arr.length; for(let i=Math.floor(len/2)-1;i>=0;i--){ heapAdjust(arr,i,len); } for(let i=arr.length-1;i>0;i--){ [arr[0],arr[i]]=[arr[i],arr[0]]; heapAdjust(arr,0,i); } return arr; } function heapAdjust(arr,pos,len){ var root=pos; for(let i=2*pos+1;i<len;i=2*i+1){ if(i+1<len&&arr[i]<arr[i+1]){ i++; } if(arr[temp]<arr[i]){ [arr[temp],arr[i]]=[arr[i],arr[temp]]; } root=i; } // return arr; }
1、分析
2、代碼
function mergeSort(arr){ if(arr.length<=1){return arr}; let mid=Math.floor(arr.length/2); let left=arr.slice(0,mid); let right=arr.slice(mid); // console.log(left+"+"+right); return merge(mergeSort(left),mergeSort(right)); } function merge(left,right){ var result=[]; while(left.length>0&&right.length>0){ if(left[0]<right[0]){ result.push(left.shift()); } else{ result.push(right.shift()); } } return result.concat(left,right); }
1、分析
2、代碼
function qSort1(arr){ if(arr.length<=1){return arr;} let pivot=arr[0]; let left=[];let right=[]; for(let i=1;i<arr.length;i++){ if(arr[i]<pivot){ left.push(arr[i]); } else{ right.push(arr[i]); } } return qSort1(left).concat(pivot,qSort1(right)); } function qSort2(arr,low,high){ if(low<high){ var pivot=partition(arr,low,high); qSort2(arr,pivot+1,high); qSort2(arr,low,pivot-1); } // return arr; } function partition(arr,low,high){ var pivot=arr[low]; while(low<high){ while(low<high&&pivot<=arr[high]){ high--; } [arr[low],arr[high]]=[arr[high],arr[low]]; while(low<high&&pivot>=arr[low]){ low++ } [arr[low],arr[high]]=[arr[high],arr[low]]; } return low; }