javascript
javascript-排序算法
插入排序
算法描述:?
1. 從第一個元素開始,該元素可以認為已經被排序?
2. 取出下一個元素,在已經排序的元素序列中從后向前掃描?
3. 如果該元素(已排序)大于新元素,將該元素移到下一位置?
4. 重復步驟 3,直到找到已排序的元素小于或者等于新元素的位置?
5. 將新元素插入到該位置后?
6. 重復步驟 2~5
現有一組數組 arr = [5, 6, 3, 1, 8, 7, 2, 4]
[5] 6 3 1 8 7 2 4 //第一個元素被認為已經被排序[5,6] 3 1 8 7 2 4 //6與5比較,放在5的右邊[3,5,6] 1 8 7 2 4 //3與6和5比較,都小,則放入數組頭部[1,3,5,6] 8 7 2 4 //1與3,5,6比較,則放入頭部[1,3,5,6,8] 7 2 4[1,3,5,6,7,8] 2 4[1,2,3,5,6,7,8] 4[1,2,3,4,5,6,7,8]- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
編程思路:雙層循環,外循環控制未排序的元素,內循環控制已排序的元素,將未排序元素設為標桿,與已排序的元素進行比較,小于則交換位置,大于則位置不動
function insertSort(arr){var tmp;for(var i=1;i<arr.length;i++){tmp = arr[i];for(var j=i;j>=0;j--){if(arr[j-1]>tmp){arr[j]=arr[j-1];}else{arr[j]=tmp;break;}}}return arr }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
時間復雜度O(n^2)
選擇排序
算法描述:直接從待排序數組中選擇一個最小(或最大)數字,放入新數組中。
[1] 5 6 3 8 7 2 4 [1,2] 5 6 3 8 7 4 [1,2,3] 5 6 8 7 2 4 [1,2,3,4] 5 6 8 7 [1,2,3,4,5] 6 8 7 [1,2,3,4,5,6] 8 7 [1,2,3,4,5,6,7] 8 [1,2,3,4,5,6,7,8]- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
編程思路:先假設第一個元素為最小的,然后通過循環找出最小元素,然后同第一個元素交換,接著假設第二個元素,重復上述操作即可
function selectionSort(array) {var length = array.length,i,j,minIndex,minValue,temp;for (i = 0; i < length - 1; i++) {minIndex = i;minValue = array[minIndex];for (j = i + 1; j < length; j++) {//通過循環選出最小的if (array[j] < minValue) {minIndex = j;minValue = array[minIndex];}}// 交換位置temp = array[i];array[i] = minValue;array[minIndex] = temp;}return array }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
時間復雜度O(n^2)
歸并排序
算法描述:?
1. 把 n 個記錄看成 n 個長度為 l 的有序子表?
2. 進行兩兩歸并使記錄關鍵字有序,得到 n/2 個長度為 2 的有序子表?
3. 重復第 2 步直到所有記錄歸并成一個長度為 n 的有序表為止。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
編程思路:將數組一直等分,然后合并
function merge(left, right) {var tmp = [];while (left.length && right.length) {if (left[0] < right[0])tmp.push(left.shift());elsetmp.push(right.shift());}return tmp.concat(left, right); }function mergeSort(a) {if (a.length === 1) return a;var mid = Math.floor(a.length / 2), left = a.slice(0, mid), right = a.slice(mid);return merge(mergeSort(left), mergeSort(right)); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
時間復雜度O(nlogn)
快速排序
算法描述:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
上述講解了分區的過程,然后就是對每個子區進行同樣做法
function quickSort(arr){if(arr.length<=1) return arr;var partitionIndex=Math.floor(arr.length/2);var tmp=arr[partitionIndex];var left=[];var right=[];for(var i=0;i<arr.length;i++){if(arr[i]<tmp){left.push(arr[i])}else{right.push(arr[i])}}return quickSort(left).concat([tmp],quickSort(right)) }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
上述版本會造成堆棧溢出,所以建議使用下面版本
原地分區版:主要區別在于先進行分區處理,將數組分為左小右大
function quickSort(arr){function swap(arr,right,left){var tmp = arr[right];arr[right]=arr[left];arr[left]=tmp;}function partition(arr,left,right){//分區操作,var pivotValue=arr[right]//最右面設為標準var storeIndex=left;for(var i=left;i<right;i++){if(arr[i]<=pivotValue){swap(arr,storeIndex,i);storeIndex++;}}swap(arr,right,storeIndex);return storeIndex//返回標桿元素的索引值}function sort(arr,left,right){if(left>right) return;var storeIndex=partition(arr,left,right);sort(arr,left,storeIndex-1);sort(arr,storeIndex+1,right);}sort(arr,0,arr.length-1);return arr; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
時間復雜度O(nlogn)
冒泡排序
算法描述:?
1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。?
2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。在這一點,最后的元素應該會是最大的數。?
3. 針對所有的元素重復以上的步驟,除了最后一個。?
4. 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。5.
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
編程思路:外循環控制需要比較的元素,比如第一次排序后,最后一個元素就不需要比較了,內循環則負責兩兩元素比較,將元素放到正確位置上
function bubbleSort(arr){var len=arr.length;for(var i=len-1;i>0;i--){for(var j=0;j<i;j++){if(arr[j]<arr[j+1]){var tmp = arr[j];arr[j]=arr[j+1];arr[j+1]=tmp}}}return arr; }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
時間復雜度O(n^2)
參考資料
排序效果?
常見排序算法?
排序算法 維基百科
總結
以上是生活随笔為你收集整理的javascript-排序算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript-内存空间
- 下一篇: JSON.parse和JSON.stri