冒泡排序多是咱們接觸的第一個排序算法了,比較簡單也實用。算法
思路:依次比較相鄰的兩個元素,值大的就換到右邊,一趟循環下來最右邊就是最大的元素了。而後再從頭開始,找第二大的元素,這樣一直走下來,整個數組就有序了。數組
能夠參考如下gif圖,理解冒泡排序的思想。
dom
那麼N個數字要排序完成,總共進行N-1趟排序,每i趟的排序次數爲(N-i)次,因此須要比較的次數就是[n(n-1)]/2,即時間複雜度爲 O(n^2)spa
直接上代碼:指針
var bubbleSort = function(array){ //冒泡排序 var length = array.length for (var i = 0; i < length; i++) { for (var j = 0; j < length-1-i; j++) { if (array[j] > array[j+1]) { swap(array, j, j+1); } } } } var swap = function(array, index1, index2){ //交換兩個元素的位置 var aux = array[index1]; array[index1] = array[index2]; array[index2] = aux; } var createNonSortedArray =function(size){ //建立一個size大小的無序列表ArrayList var array = new Array(); for (var i = size; i > 0; i--) { array.push( parseInt(Math.random()*10000)); } return array; } var arr = createNonSortedArray(10000); bubbleSort(arr);
這個代碼不管是最好的狀況(數組有序),仍是最壞狀況(數組逆序),須要比較的次數都是[n(n-1)]/2,也就是時間複雜度均爲 O(n^2),但若是是最好的狀況,一趟比較下來發現沒有元素要交換,那麼時間複雜度就能降到 O(n),故再加一個標誌位,就能讓冒泡排序的最好狀況時間複雜度降到 O(n),以下:code
var bubbleSort = function(array){ var length = array.length, for (var i = 0; i < length; i++) { var didSwap = false; //設置標誌位 for (var j = 0; j < length-1-i; j++) { if (array[j] > array[j+1]) { swap(array, j, j+1); didSwap = true; } } if(!didSwap) break; //沒有交換了,直接跳出循環 } }
思想:一個元素就是有序的,那麼從第二個元素開始,與它以前的元素做比較,若是比以前的元素小,就交換位置。直到比某個元素大,就結束這次循環,也就找到了該元素應該在的位置了。把全部元素都走一遍,整個數組就有序了。排序
能夠參考如下gif圖,理解插入排序的思想。
it
在插入排序中,當待排序數組是有序時,是最優的狀況,只需當前數跟前一個數比較一下就能夠了,這時一共須要比較N-1次,時間複雜度爲 O(n)。io
最壞的狀況是待排序數組是逆序的,此時須要比較次數最多,總次數記爲:1+2+3+…+N-1,因此,插入排序最壞狀況下的時間複雜度爲 O(n^2)。function
var insertionSort = function(array){ var length = array.length, temp, j; for(var i = 1; i<length; i++){ j = i; temp = array[i]; while(j > 0 && array[j-1] > temp){ array[j] = array[j-1]; j--; } array[j] = temp; } }
思想:從數組的第一個元素開始,一趟循環,找出最小的,放到第一個元素的位置,而後從第二個元素開始,重複以前的步驟,直到數組整個有序。
能夠參考如下gif圖,理解選擇排序的思想。
其中橙色表示當前排序趟的最左側元素,綠色是這趟排序找到的最小元素的位置,灰背景是當前比較的指針。
時間複雜度其實與冒泡排序相似,也是一個 O(n)複雜度的算法。
代碼以下:
var selectionSort = function(array){ var length = array.length, indexMin; for (var i = 0; i < length-1; i++) { indexMin = i; for(var j = i;j<length;j++){ if(array[indexMin] > array[j]){ indexMin = j; } } if(i != indexMin){ swap(array, i, indexMin) //與以前冒泡排序swap方法一致,交換元素位置 } } }