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 的有序表為止。

5 6 3 1 8 7 2 4[5,6] [3,1] [8,7] [2,4][5,6] [1,3] [7,8] [2,4][5,6,1,3] [7,8,2,4][1,3,5,6] [2,4,7,8][1,2,3,4,5,6,7,8]
  • 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. 在數據集之中,選擇一個元素作為”基準”(pivot)。
  2. 所有小于”基準”的元素,都移到”基準”的左邊;所有大于”基準”的元素,都移到”基準”的右邊。這個操作稱為分區 (partition)操作,分區操作結束后,基準元素所處的位置就是最終排序后它的位置。
  3. 對”基準”左邊和右邊的兩個子集,不斷重復第一步和第二步,直到所有子集只剩下一個元素為止。
5 6 3 1 8 7 2 4pivot
|
5 6 3 1 9 7 2 4
|
storeIndex5 6 3 1 9 7 2 4//將5同6比較,大于則不更換
|
storeIndex3 6 5 1 9 7 2 4//將5同3比較,小于則更換|storeIndex3 6 1 5 9 7 2 4//將5同1比較,小于則不更換|storeIndex
...3 6 1 4 9 7 2 5//將5同4比較,小于則更換|storeIndex3 6 1 4 5 7 2 9//將標準元素放到正確位置|
storeIndex pivot
  • 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.

5 6 3 1 8 7 2 4[5 6] 3 1 8 7 2 4 //比較5和65 [6 3] 1 8 7 2 45 3 [6 1] 8 7 2 45 3 1 [6 8] 7 2 45 3 1 6 [8 7] 2 45 3 1 6 7 [8 2] 45 3 1 6 7 2 [8 4]5 3 1 6 7 2 4 8  // 這樣最后一個元素已經在正確位置,所以下一次開始時候就不需要再比較最后一個
  • 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)

參考資料

排序效果?
常見排序算法?
排序算法 維基百科

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247726.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247726.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247726.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DPDK并行計算

參考文獻&#xff1a; 《深入淺出DPDK》 https://www.cnblogs.com/LubinLew/p/cpu_affinity.html ...................................................................... 前言&#xff1a; 處理器提高性能主要是通過兩個途徑&#xff0c;一個是提高IPC&#xff08;CPU每一時…

Highcharts圖表-ajax-獲取json數據生成圖表

重點說明此代碼是針對一個報表顯示多個項對比顯示。 直接貼代碼&#xff1a;web端 <script type"text/JavaScript" src"js/jQuery/jquery-1.7.2.js"></script> <script type"text/javascript" src"j…

關于RGBDSLAMV2學習、安裝、調試過程

Step&#xff11;&#xff1a;https://github.com/felixendres/rgbdslam_v2/wiki/Instructions-for-Compiling-Rgbdslam-(V2)-on-a-Fresh-Ubuntu-16.04-Install-(Ros-Kinetic)-in-Virtualbox 照著這個instructions安裝好 rgbdslamv2&#xff0c;并且在安裝的過程中&#xff0c;…

Java—List的用法與實例詳解

List特點和常用方法 List是有序、可重復的容器。 有序指的是&#xff1a;List中每個元素都有索引標記。可以根據元素的索引標記&#xff08;在List中的位置&#xff09;訪問元素&#xff0c;從而精確控制這些元素。 可重復指的是&#xff1a;List允許加入重復的元素。更確切地講…

Java—遍歷集合的N種方式總結Collections工具類

遍歷集合的N種方式總結 【示例1】遍歷List方法1&#xff0c;使用普通for循環 for(int i0;i<list.size();i){ //list為集合的對象名 String temp (String)list.get(i); System.out.println(temp); } 【示例2】遍歷List方法2&#xff0c;使用增強for循環(使用泛型定義…

java類的結構2: 方法—(12)

面向對象的特征一&#xff1a;封裝與隱藏 1.為什么要引入封裝性&#xff1f; 我們程序設計追求“高內聚&#xff0c;低耦合”。 高內聚 &#xff1a;類的內部數據操作細節自己完成&#xff0c;不允許外部干涉&#xff1b; 低耦合 &#xff1a;僅對外暴露少量的方法用于使用。…

Docker 環境下部署 redash

環境&#xff1a; centos7 官網&#xff1a;https://redash.io/help/open-source/dev-guide/docker 一、安裝步驟 1、虛擬機安裝 安裝vmware&#xff0c;并安裝centos7 2、安裝docker docker安裝手冊 3、安裝nodejs centos下安裝Nodejs 4、redash安裝 1)、clone git repostory …

List接口常用實現類的特點和底層實現

List接口常用的實現類有3個&#xff1a;ArrayList、LinkedList、Vector。 那么它們的特點和底層實現有哪些呢&#xff1f; ArrayList特點和底層實現 ArrayList底層是用數組實現的存儲。 特點&#xff1a;查詢效率高&#xff0c;增刪效率低&#xff0c;線程不安全。我們一般使用…

java面向對象的特征 —(13)

面向對象的特征一&#xff1a;封裝與隱藏 1.為什么要引入封裝性&#xff1f; 我們程序設計追求“高內聚&#xff0c;低耦合”。 高內聚 &#xff1a;類的內部數據操作細節自己完成&#xff0c;不允許外部干涉&#xff1b; 低耦合 &#xff1a;僅對外暴露少量的方法用于使用。…

null指針

做了一個關于花卉花木的管理操作&#xff0c;后期因為花卉的類型需要顯示在花卉詳情頁面&#xff0c;所以需要兩張表連接。在不寫sql語句的前提下&#xff0c;用了外鍵連接。因為在先前的操作過程中&#xff0c;沒有將外鍵所在字段設置為必填項&#xff0c;導致有一個外鍵字段為…

jquery Ajax請求本地json

1-1-1 json文件內容(item.json) [{"name":"張國立","sex":"男","email":"zhangguoli123.com","url":"./img/1.jpg"},{"name":"張鐵林","sex":"男"…

論文《learning to link with wikipedia》

learning to link with wikipedia 一、本文目標&#xff1a; 如何自動識別非結構化文本中提到的主題&#xff0c;并將其鏈接到適當的Wikipedia文章中進行解釋。 二、主要借鑒論文&#xff1a; Mihalcea and Csomai----Wikify!: linking documents to encyclopedic knowledge 第…

java類的結構:構造器 —(13)

1.構造器&#xff08;或構造方法&#xff09;&#xff1a;Constructor 構造器的作用&#xff1a; 1.創建對象2.初始化對象的信息 2.使用說明&#xff1a; 1.如果沒顯式的定義類的構造器的話&#xff0c;則系統默認提供一個空參的構造器2.定義構造器的格式&#xff1a;權限修…

java面向對象的特征二:繼承性 —(14)

1.為什么要有類的繼承性&#xff1f;(繼承性的好處&#xff09; ① 減少了代碼的冗余&#xff0c;提高了代碼的復用性② 便于功能的擴展③ 為之后多態性的使用&#xff0c;提供了前提 圖示&#xff1a; 2.繼承性的格式&#xff1a; class A extends B{} A:子類、派生類、s…

vuejs怎么在服務器上發布部署

首先VUE 是一個javascript的前端框架&#xff0c;注定了它是運行在瀏覽器里的&#xff0c;對服務器本地沒有任何要求&#xff0c;只要一個靜態文件服務器能通過http訪問到其資源文件就足矣&#xff01;無論你是用apache ,ngnix 就算你要用node 自己實現一個靜態文件服務器&…

C#入門詳解(14)

接口&#xff0c;依賴反轉&#xff0c;單元測試 接口是協約是規定&#xff0c;所以必須是公開的&#xff0c;只能是public; static void Main(string[] args){int[] num1 new int[] { 1, 2, 3, 4, 5 };Console.WriteLine(Sum(num1).ToString());Console.WriteLine(""…

SpringBoot操作MongoDB實現增刪改查

本篇博客主講如何使用SpringBoot操作MongoDB。 SpringBoot操作MongoDB實現增刪改查 &#xff08;1&#xff09;pom.xml引入依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifac…

java面向對象的特征三:多態性 —(15)

1.多態性的理解&#xff1a;可以理解為一個事物的多種形態。 2.何為多態性&#xff1a; 對象的多態性&#xff1a;父類的引用指向子類的對象&#xff08;或子類的對象賦給父類的引用&#xff09; 舉例&#xff1a; Person p new Man(); Object obj new Date(); 3.多態性的…

vue 中$index $key 已移除

之前可以這樣: 123456<ulid"example"><liv-for"item in items">{{$index}}{{$key}}</li></ul>現在已經移除,如果還用的話就會報錯:Uncaught ReferenceError: $index is not defined; 現在這樣寫: 123456<ul id"example&qu…

vue-resource全攻略

Vue.js——vue-resource全攻略 概述 上一篇我們介紹了如何將$.ajax和Vue.js結合在一起使用&#xff0c;并實現了一個簡單的跨域CURD示例。Vue.js是數據驅動的&#xff0c;這使得我們并不需要直接操作DOM&#xff0c;如果我們不需要使用jQuery的DOM選擇器&#xff0c;就沒有必要…