在這裏,我詳細的講一下我我的對於插入排序的理解。javascript
每一個人對於事物的理解都是不同的,由於每一個人對世界萬物的見解和思考方式都不同。所以,對於排序算法,我想每一個人都有本身的理解方式,因此,雖然博客園裏有不少關於排序的文章,但那只是其餘人對這幾個排序的理解方式,而筆者也有本身的理解方式,因此,筆者也就沒有在乎博客園寫了那麼多關於排序的文章而還在這裏寫下我的的看法了。css
對於插入排序,筆者是這麼理解的:html
插入排序就是把一組數字分紅兩部分,一部分是排好順序的,另外一部分是沒有排好順序的,而後,就是從沒有排好順序的那組數字中獲取數字,把它插入到已經排好的順序的那部分數字中,固然,在插入到已經排好順序的那部分數字時,你還必須讓這個插入進來的數字與已經排好順序的數字進行比較,爲的是保證已經排好的順序的那部分數字不被打亂,插入排序的關鍵也就是這裏,若是可以理解這裏,我想對於接下來我寫的代碼應該不難理解了。java
我舉個例子:算法
這是個雜亂的一組數字:8,1,2,5,9,3,4,6,7,0數組
看到上面的那組數字嗎?你以爲能把這組數字分出一部分有序的出來嗎?由於,咱們插入排序首先要作的就是在一組數字中找出有序的部分,因此,首先,你得從一組數字中找到有序的才行對吧?其實,上面那組數字是能夠找到有序的部分的。怎麼說呢?很簡單,你把第一個數字8當成一部分,其他的當成另一部分,不就分出一部分有序的數字和一部分無序的數字了嗎?你想一想,第一部分就是一個數字8,一個數字構成的一部分,它都不用比較了,這還不是有序的那還得了,呵呵。測試
之因此在這裏提一下一個數字當成一部分的狀況,那是由於,咱們所提供的插入排序的數字是雜亂的,無序的,咱們誰也不能保證最開始的那部分必定是有序的,所以,咱們就只能選擇一個數字做爲有序的那部分才能保證全部的排序都是在有序那部分進行的,否則,插入排序就沒辦法找到有序的那部分了。ui
插入排序開始:spa
第一個有序部分(就是第一個數字了):8調試
第一個無序部分(就是剩下的部分了):1,2,5,9,3,4,6,7,0
根據前面所講的插入排序原理:從無序部分中獲取數字,把它插入到有序的那一部分中。
一、這裏怎麼在無序部分中獲取數字?
二、怎麼把獲取的數字有序的插入到有序部分中?換句話說,就是怎麼讓這個獲取的數字插入到有序的那部分以後,有序的那部分仍是有序的,並不會被這個插入的數字破壞掉隊形而變得無序?
首先回答第一個問題:
這個問題其實很簡單啦,咱們把那組無序的數組分紅兩部分以後,只要從無序的那部分數字的第一個數字開始日後面獲取數字就好了,是吧?
接下來回答第二個問題:
這個問題有點複雜,我就不敘述了,直接舉例子吧,這樣子更容易理解。
第二次插入排序:
首先咱們從上面已經分好的無序部分:1,2,5,9,3,4,6,7,0(前面已經把8分紅有序的部分了)獲取第一個數字1,假設咱們是從小排到大的排序這組數字,獲取1這個數字以後,咱們就要把1插入到8中啦,對吧?
咱們把1和8作比較,比較規則:大於,8>1?真,既然是真,那麼它們就要調換位置了,對吧?
因此通過一次排序以後,原來的那組有序數字和無序數字就變成了下面的了:
第二個有序部分:1,8
第二個無序部分:2,5,9,3,4,6,7,0
通過兩輪的有序和無序分組以後,就獲得上面的兩個有序數字和無序數字了,接下來,咱們繼續插入排序
依然從後面的無序部分獲取數字2,獲取以後,從有序部分的後面數字開始逐一的和2作比較,8>2嗎?真,那麼它們二者就調換位置。接下來讓1和2做比較,1>2嗎?假,那麼就跳過無論,因此,就獲得下面的有序和無序部分了。
第三個有序部分:1,2,8
第三個無序部分:5,9,3,4,6,7,0
比較到這裏,插入排序已經初步造成有序數字了,接下來的比較我就不敘述了,大家本身想一想吧。接下來是代碼,代碼的思惟和這裏的描述是同樣的,你能夠本身調試看一下代碼的執行過程就再明白不過了。
注意、每一輪比較事後,有序部分總會多一個元素,而無序部分則少一個元素,插入排序嘛,就是從無序部分截取數字插入到有序部分中啦,這和下面的代碼循環是一致的。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-cn"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title>js的插入排序</title> <meta name="keywords" content="關鍵字列表" /> <meta name="description" content="網頁描述" /> <link rel="stylesheet" type="text/css" href="" /> <style type="text/css"></style> <script type="text/javascript"> //插入排序,參數是數組 function insertSort(arr){ //判斷參數的合法性 if(toString.call(arr) !== '[object Array]'){ return false; } //獲取數組的長度 var len = arr.length; if(len <= 1){ return arr;//小於等於1不用排序 } //i=1開始,留着0做爲有序部分,也就是說,外層循環獲取數組後面的元素,也就是上面所講的無序部分 for(var i=1;i<len;i++){ //j=i-1,就是獲取有序部分最後的一個元素做爲對照,也就是有序部分 for(var j=i-1;j>=0;j--){//注意,j--,就是從有序部分的後面元素開始和無序部分的元素做比較 if(arr[j] > arr[j+1]){//第一個j+1也就是外層循環i, //互換元素,對前面數組進行排序 var temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } }
return arr; } //測試 var ar = [9,3,8,5,2,7,0,6,1,4]; alert(insertSort(ar)); </script> </head> <body> </body> </html>