這一演算法的核心思想為,先隨機選乙個數作為標兵或者說是標記(這個數一般來說選擇該無序陣列的中間那個元素;此處筆者選取第乙個實現演算法,當選取完畢後以此標兵為參照將比這個數大的放到他的右邊,比他小的放到左邊.這樣一趟排序過後就能讓這個標記左邊的數比他小,右邊的數都比他大.下一趟排序則分別選取他的左半邊陣列和右半邊陣列重複之前的操作(此操作一般由遞迴實現)當傳入的區間只有乙個元素的時候那麼開始返回不再繼續呼叫函式自身(即為遞迴的終止條件)因為只有乙個數字是必定有序的
遞迴實現**如下:
//快速排序(遞迴)
function quicksort(arr,start = 0,end = arr.length-1)
//迴圈完成此時arr[r]
//而arr[l]的的值已經被key儲存所以下一步則應該找出乙個比key大卻在key的左邊的數放入arr[r]的位置
while(lkey)
[arr[r],arr[l]] =[arr[l],arr[r]];
//這樣一次迴圈就可以讓乙個在key左邊比key大的數放到key的右邊,比key小的放到左邊
} quicksort(arr,start,l-1);//
遞迴呼叫 -1 是為了避免區間重複
下面列出非遞迴版本的快排:
function quicksort2(arr,start = 0,end = arr.length-1)對十萬逆序陣列排序耗時如下:arr[l] =arr[r];
while(lkey)
arr[r] =arr[l];
arr[l] =key;
}//當兩個引數不相等,即該區間不止乙個數時,則將下乙個區間的引數存入引數陣列
if(low
mid.push(low,l);
if(l+1
mid.push(l+1,height);}}
}
由於非遞迴版本陣列方法呼叫較多,故此花費時間略久於遞迴版本
希爾排序和快排一樣都是不穩定排序,快速排序的不穩定是因為,標兵的選取並不能直接選取到剛好是區間中中間大小的數,所以當每個區間的第乙個數剛好都是該區間最小的數,那麼達到快排的最壞情況(以區間的第乙個數為標兵為例). 而希爾排序其核心是插入排序所以當陣列剛好為逆序時其效率最低,此時也就是希爾排序的最壞情況但與快排不同的是最壞情況的希爾排序速率並不會下降明顯.
希爾排序演算法的和心在於,利用了當待排序陣列基本有序的時候插入排序效率極高的原理,即選取不同的步長對其進行插排,當步長為一時則與普通的插排沒有區別,而效率的提公升在於經過前期數次的插排使陣列基本有序
其**如下:
function普通插排耗時如下:shellsort(arr)
insertionsort(tarr);
//將分好組的陣列進行插排
for (let j = i; j < length; j = j +steep)
//排好序的陣列對映回原陣列
tarr.length = 0;//
清空臨時陣列
} }
else
insertionsort(arr);
steep = parseint(steep / 2);}}
希爾排序耗時如下:
與快排和希爾排序不同的是歸併排序是穩定排序
其核心思想在於當陣列只有乙個數時肯定是有序的,所以現將陣列拆分為乙個乙個的數,然後在合併的過程中對齊排序,其弊端在於需要占用乙個與原陣列等長的臨時陣列空間來存放變數
遞迴版**如下:
//遞迴版耗時:歸併排序(遞迴)
function merge(arr,start,mid,end,temp)
while(l<=mid)
while(r<=end)
while(start<=end)
}function recursivesort(arr,start = 0,end = arr.length-1,temp =)
}
非遞迴**:
function recursivesort2(arr,start = 0,end = arr.length-1)非遞迴耗時如下:while
(pra.length)
}
快排在資料量大時的優勢較為明顯,希爾排序適用於中量資料,而當空間要求不限時歸併也不失為一種選擇
posted @
2018-08-25 13:28
巽秋 閱讀(
...)
編輯收藏
Javascript的基礎語法
一 js的組成 1 ecmascript 基本語法 2 bom 瀏覽器模型 3 dom文件物件模型 二 在html中的使用 1 使用script標籤引入js檔案 2 把js 寫在script標籤中 script最好放在html元素的最後 三 在頁面中輸出內容 1 console.log 把內容輸出到...
JavaScript 的基礎語法
跳轉頁面 function fun h,t this.label h this.target t var obj new object obj.name objtest var array new array array.push 1 onclick 滑鼠單擊事件 onmouseover 滑鼠經過事...
JavaScript 的程式設計基礎
建立乙個自定義列表 如何建立乙個註腳 注釋也是必不可少的 katex數學公式 新的甘特圖功能,豐富你的文章 uml 圖表 flowchart流程圖 匯出與匯入 你好!這是你第一次使用markdown編輯器所展示的歡迎頁。如果你想學習如何使用markdown編輯器,可以仔細閱讀這篇文章,了解一下mar...