加勒比HEZYO黑人专区-久久精品国产99国产精品亚洲-精品国产18久久久久久-久久人妻少妇嫩草AV

歡迎光臨 織晶網(wǎng)絡(luò)官網(wǎng)!

  • 服務(wù)支持
  • 020-39182790
技術(shù)文檔您現(xiàn)在的位置:首頁 > 服務(wù)支持 > 技術(shù)文檔

算法之旅 ,選擇排序法

作者:織晶客服部   發(fā)布于:2017/9/25 15:59:30  點(diǎn)擊量:  來源:織晶網(wǎng)絡(luò)

算法的基本概念

算法是什么,它有何作用

為解決一個問題而采取的方法和步驟,稱為算法。

我們可以把算法看成一本“福字剪紙教程”,其中每一種算法就是剪紙教程中的一種包含“固定步驟”的剪紙方法,使用者只要按照步驟進(jìn)行剪紙,就可以剪出好看的福字。

之所以有這么多的算法,在于不同算法解決問題的效率各有不同,適合不同的場景。隨著問題規(guī)模的增長,算法之間的差距會變的不可跨越。提升解決問題的效率,不僅僅依賴于選擇快速的硬件,還依賴于選擇有效(適合)的算法。

排序的使用場景

針對數(shù)組進(jìn)行從大到小(或從小到大)的排序。例如:管理系統(tǒng)中按照成績的排序,按閱讀量對文章的排序等。

數(shù)據(jù)快速的計算與排序,與前端頁面性能有直接的關(guān)系。(譬如在頁面中有10000條的數(shù)據(jù)需要靠JS進(jìn)行排序,采用不同的算法所消耗的時間差距甚大,直接影響著網(wǎng)站的用戶體驗)

常見的排序方法

較為常見的排序方法,包括:冒泡排序、選擇排序、快速排序、二分法插入排序等。

由于排序的算法有很多,在本次“算法系列”的分享當(dāng)中,我們先從簡單易上手的選擇排序法開始,其它的排序算法會隨后陸續(xù)跟大家一起分享。

選擇排序法的基本原理

先找到序列中最小的數(shù),將它和序列中第一個數(shù)交換位置;

接下來,在剩下的序列中繼續(xù)此操作:找到最小的數(shù),將它和序列中的第二個數(shù)交換位置;

依此類推,直到將整個序列排序完成。

簡言之,選擇排序就是 —— 不斷地選擇剩余序列中的最小者,然后與未排序數(shù)列的“第一個”數(shù)字交換位置。

案例說明

如下數(shù)組中,黑色代表待排序,藍(lán)色代表已排序

實(shí)現(xiàn)選擇排序的步驟分解

排序次數(shù)

排序次數(shù):序列長度 – 1(注意,不是比較次數(shù));

因為序列中的最后一個數(shù)不需要再次比較大小,故排序次數(shù)為 序列長度 – 1。

找到最小的數(shù)

序列中找到最小的數(shù),并記錄該數(shù)的索引值;

因為minIndex默認(rèn)開始為0,則第一個數(shù)無需與自身比較,所以j = i + 1;

  1. // 遍歷序列,找到最小的數(shù)
  2. for (var j = i + 1; j < len; j++) {
  3.     if (arr[j] < arr[minIndex]) {
  4.         // 記錄最小數(shù)的索引
  5.         minIndex = j;
  6.     };
  7. };


在排序次數(shù)內(nèi)多次遍歷找到最小的數(shù),因此需要再用一個for語句來進(jìn)行控制。

  1. // 排序次數(shù)
  2. for (var i = 0; i < len - 1; i++) {
  3.     // 默認(rèn)最小數(shù)的索引為i
  4.     minIndex = i;
  5.  
  6.     // 遍歷序列,找到最小的數(shù)
  7.     for (var j = i + 1; j < len; j++) {
  8.         if (arr[j] < arr[minIndex]) {
  9.             // 記錄最小數(shù)的索引
  10.             minIndex = j;
  11.         };
  12.     };
  13. };


兩數(shù)交換位置

利用temp變量,實(shí)現(xiàn)兩數(shù)組元素之間數(shù)值的交換,也就是交互位置。

  1. temp = arr[i];
  2. arr[i] = arr[minIndex];
  3. arr[minIndex] = temp;


選擇排序法完整代碼

  1. var arr = [9, 8, 3, 1, 2, 4],
  2.     len = arr.length,
  3.     minIndex, temp;
  4.     // 排序次數(shù)
  5.     for (var i = 0; i < len - 1; i++) {
  6.         // 默認(rèn)最小數(shù)的索引為i
  7.         minIndex = i;
  8.         // 遍歷剩下的序列,找到最小的數(shù)
  9.         for (var j = i + 1; j < len; j++) {
  10.             if (arr[j] < arr[minIndex]) {
  11.                 // 記錄最小數(shù)的索引
  12.                 minIndex = j;
  13.             };
  14.         };
  15.     // 兩數(shù)交互位置
  16.     temp = arr[i];
  17.     arr[i] = arr[minIndex];
  18.     arr[minIndex] = temp;
  19. }; 
  20. console.log(arr);

選擇排序法的效率

算法復(fù)雜度的基本概念

算法復(fù)雜度分為時間復(fù)雜度和空間復(fù)雜度(時間和空間是計算機(jī)最重要的資源,因此復(fù)雜度分為時間和空間)。

時間復(fù)雜度:指執(zhí)行算法所需要的計算工作量;

空間復(fù)雜度:指執(zhí)行算法所需要的內(nèi)存空間。

時間復(fù)雜度:O(n*n)

時間復(fù)雜度是總運(yùn)算次數(shù)表達(dá)式中受n的變化影響最大的項(不含系數(shù));

第一次循環(huán)比較n-1次,然后是n-2次,n-3次,依此類推,最后一次循環(huán)比較1次,總的比較次數(shù)和為(n - 1 + 1) * n / 2,即進(jìn)行比較操作的時間復(fù)雜度為O(n^2)

Tips:選擇排序的比較次數(shù)與序列的初始排序無關(guān)。

空間復(fù)雜度:O(1)

排序算法需要一個額外的空間(temp變量)來交換元素的位置。

不穩(wěn)定排序的一種算法

選擇排序是一種不穩(wěn)定排序的算法。

比如:序列[3, 8, 3, 1, 9 ],第一次循環(huán)第1個元素3會和1交換,變成[1, 8, 3, 3, 9],此時,原序列中兩個3的先后順序被破壞。



上一篇:學(xué)習(xí)Linux系統(tǒng)的優(yōu)勢及幾點(diǎn)建議

下一篇:80端口,8080端口,443端口,21端口,3306端口,1433端口是怎么定義的?