數(shù)組是一個由 固定長度 的 特定類型元素 組成的序列,一個數(shù)組可以由零個或多個元素組成。 數(shù)組是值類型
10年積累的成都網站設計、成都網站制作經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站設計后付款的網站建設流程,更有興平免費網站建設讓你可以放心的選擇與我們合作。
數(shù)組的每個元素都可以通過索引下標來訪問,索引下標的范圍是從0開始到數(shù)組長度減1的位置,內置函數(shù) len() 可以返回數(shù)組中元素的個數(shù)。
2.類型的打印,結果的第二種打印方式
3.對元素的修改或者賦值
4.判斷數(shù)組是否相等:長度、類型
4.數(shù)組的地址:連續(xù)存儲的空間
5.數(shù)組的賦值、地址、取值
6.數(shù)組的默認值
7.數(shù)組的初始化
8.數(shù)組的逆置
9.求數(shù)組的最大值、最小值、平均值
10.對數(shù)組字符串進行連接
11.冒泡排序法的實現(xiàn)
12.數(shù)組做函數(shù)的參數(shù)
13.二維數(shù)組:賦值和地址
14.二維數(shù)組:打印和輸出
15. 指針數(shù)組,每一個元素都是地址
17.數(shù)組的內存分配
.example-btn{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.example-btn:hover{color:#fff;background-color:#47a447;border-color:#398439}.example-btn:active{background-image:none}div.example{width:98%;color:#000;background-color:#f6f4f0;background-color:#d0e69c;background-color:#dcecb5;background-color:#e5eecc;margin:0 0 5px 0;padding:5px;border:1px solid #d4d4d4;background-image:-webkit-linear-gradient(#fff,#e5eecc 100px);background-image:linear-gradient(#fff,#e5eecc 100px)}div.example_code{line-height:1.4em;width:98%;background-color:#fff;padding:5px;border:1px solid #d4d4d4;font-size:110%;font-family:Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;word-break:break-all;word-wrap:break-word}div.example_result{background-color:#fff;padding:4px;border:1px solid #d4d4d4;width:98%}div.code{width:98%;border:1px solid #d4d4d4;background-color:#f6f4f0;color:#444;padding:5px;margin:0}div.code div{font-size:110%}div.code div,div.code p,div.example_code p{font-family:"courier new"}pre{margin:15px auto;font:12px/20px Menlo,Monaco,Consolas,"Andale Mono","lucida console","Courier New",monospace;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;border:1px solid #ddd;border-left-width:4px;padding:10px 15px} 排序算法是《數(shù)據(jù)結構與算法》中最基本的算法之一。排序算法可以分為內部排序和外部排序,內部排序是數(shù)據(jù)記錄在內存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。以下是冒泡排序算法:
冒泡排序(Bubble Sort)也是一種簡單直觀的排序算法。它重復地走訪過要排序的數(shù)列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數(shù)列的工作是重復地進行直到沒有再需要交換,也就是說該數(shù)列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢"浮"到數(shù)列的頂端。
作為最簡單的排序算法之一,冒泡排序給我的感覺就像 Abandon 在單詞書里出現(xiàn)的感覺一樣,每次都在第一頁第一位,所以最熟悉。冒泡排序還有一種優(yōu)化算法,就是立一個 flag,當在一趟序列遍歷中元素沒有發(fā)生交換,則證明該序列已經有序。但這種改進對于提升性能來
說并沒有什么太大作用。 1. 算法步驟
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數(shù)。
針對所有的元素重復以上的步驟,除了最后一個。
持續(xù)每次對越來越少的元素重復上面的步驟,直到沒有任何一對數(shù)字需要比較。
2. 動圖演示
3. 什么時候最快
當輸入的數(shù)據(jù)已經是正序時(都已經是正序了,我還要你冒泡排序有何用?。?/p>
4. 什么時候最慢
當輸入的數(shù)據(jù)是反序時(寫一個 for 循環(huán)反序輸出數(shù)據(jù)不就行了,干嘛要用你冒泡排序呢,我是閑的嗎)。 5. JavaScript 代碼實現(xiàn) 實例 function bubbleSort ( arr ) {
var len = arr. length ;
for ( var i = 0 ; i arr [ j+ 1 ] :
? ? ? ? ? ? arr [ j ] , arr [ j + 1 ] = arr [ j + 1 ] , arr [ j ]
return arr
7. Go 代碼實現(xiàn) 實例 func bubbleSort ( arr [] int ) [] int {
? ? length := len ( arr )
? ? for i := 0 ; i length ; i ++ {
? ? ? ? ? ? for j := 0 ; j length - 1 - i ; j ++ {
? ? ? ? ? ? ? ? ? ? if arr [ j ] arr [ j + 1 ] {
? ? ? ? ? ? ? ? ? ? ? ? ? ? arr [ j ], arr [ j + 1 ] = arr [ j + 1 ], arr [ j ]
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? }
? ? return arr
}
8. Java 代碼實現(xiàn) 實例 public class BubbleSort implements IArraySort {
@Override
public int [ ] sort ( int [ ] sourceArray ) throws Exception {
? ? // 對 arr 進行拷貝,不改變參數(shù)內容
? ? int [ ] arr = Arrays . copyOf ( sourceArray, sourceArray. length ) ;
? ? for ( int i = 1 ; i
基本設計思路:
類型轉換、類型斷言、動態(tài)派發(fā)。iface,eface。
反射對象具有的方法:
編譯優(yōu)化:
內部實現(xiàn):
實現(xiàn) Context 接口有以下幾個類型(空實現(xiàn)就忽略了):
互斥鎖的控制邏輯:
設計思路:
(以上為寫被讀阻塞,下面是讀被寫阻塞)
總結,讀寫鎖的設計還是非常巧妙的:
設計思路:
WaitGroup 有三個暴露的函數(shù):
部件:
設計思路:
結構:
Once 只暴露了一個方法:
實現(xiàn):
三個關鍵點:
細節(jié):
讓多協(xié)程任務的開始執(zhí)行時間可控(按順序或歸一)。(Context 是控制結束時間)
設計思路: 通過一個鎖和內置的 notifyList 隊列實現(xiàn),Wait() 會生成票據(jù),并將等待協(xié)程信息加入鏈表中,等待控制協(xié)程中發(fā)送信號通知一個(Signal())或所有(Boardcast())等待者(內部實現(xiàn)是通過票據(jù)通知的)來控制協(xié)程解除阻塞。
暴露四個函數(shù):
實現(xiàn)細節(jié):
部件:
包: golang.org/x/sync/errgroup
作用:開啟 func() error 函數(shù)簽名的協(xié)程,在同 Group 下協(xié)程并發(fā)執(zhí)行過程并收集首次 err 錯誤。通過 Context 的傳入,還可以控制在首次 err 出現(xiàn)時就終止組內各協(xié)程。
設計思路:
結構:
暴露的方法:
實現(xiàn)細節(jié):
注意問題:
包: "golang.org/x/sync/semaphore"
作用:排隊借資源(如錢,有借有還)的一種場景。此包相當于對底層信號量的一種暴露。
設計思路:有一定數(shù)量的資源 Weight,每一個 waiter 攜帶一個 channel 和要借的數(shù)量 n。通過隊列排隊執(zhí)行借貸。
結構:
暴露方法:
細節(jié):
部件:
細節(jié):
包: "golang.org/x/sync/singleflight"
作用:防擊穿。瞬時的相同請求只調用一次,response 被所有相同請求共享。
設計思路:按請求的 key 分組(一個 *call 是一個組,用 map 映射存儲組),每個組只進行一次訪問,組內每個協(xié)程會獲得對應結果的一個拷貝。
結構:
邏輯:
細節(jié):
部件:
如有錯誤,請批評指正。
冒泡排序要對一個列表多次重復遍歷。它要比較相鄰的兩項,并且交換順序排錯的項。每對 列表實行一次遍歷,就有一個最大項排在了正確的位置。大體上講,列表的每一個數(shù)據(jù)項都會在 其相應的位置 “冒泡”。如果列表有 n 項,第一次遍歷就要比較 n-1 對數(shù)據(jù)。需要注意,一旦列 表中最大(按照規(guī)定的原則定義大小)的數(shù)據(jù)是所比較的數(shù)據(jù)對中的一個,它就會沿著列表一直 后移,直到這次遍歷結束