資料結構和演算法

2022-06-27 15:12:10 字數 2509 閱讀 6153

氣泡排序

原理

依次比較相鄰的兩個值,如果後面的比前面的小,則將小的元素排到前面。依照這個規則進行多次並且遞減的迭代,直到順序正確。

時間複雜度,空間複雜度,穩定性

function sortarr(arr)}}

return arr;

}sortarr(examplearr);

(2).快速排序

原理:快速排序思想:先找到乙個基準點(一般指數組的中部),然後陣列被該基準點分為兩部分,依次與該基準點資料比較,如果比它小,放左邊;反之,放右邊。

左右分別用乙個空陣列去儲存比較後的資料。最後遞迴執行上述操作,直到陣列長度<=1;

時間複雜度o(logn),空間複雜度o(n)~o(n*n),穩定性好,常用

var str =[8,94,15,88,55,76,21,39];

var times=0;

var quicksort=function(arr)

var midindex=math.floor(arr.length/2);//取基準點,捨棄小數 math,floor 捨棄小數取整

var midindexval=arr.splice(midindex,1);//取基準點的值

var left=;//存放比基準點小的陣列

var right=;//存放比基準點大的陣列

//遍歷陣列,進行判斷分配

for(var i=0;iif(arr[i]left.push(arr[i]);//比基準點小的放在左邊陣列

}else

console.log("第"+(++times)+"次排序後:"+arr);

}//遞迴執行以上操作,對左右兩個陣列進行操作,直到陣列長度為<=1;

return quicksort(left).concat(midindexval,quicksort(right));//concat(引數) 用於陣列之間的連線,

};console.log(quicksort(str));

(3).hash表

hash表是一種特殊的資料結構,它和陣列,鍊錶,二叉排序不同,它採用了函式對映的思想將記錄的儲存位置與記錄的關鍵字關聯起來,從而能夠很快速地進行查詢。

1.hash表的設計思想:

張三 15812220074

李四 15812220075

王五 15812220076

對於一般的線性表,比如鍊錶,如果要儲存聯絡人資訊:

那麼可能會設計乙個結構體包含姓名,手機號碼這些資訊,然後把4個聯絡人的資訊存到一張鍊錶中,會從鍊錶的頭結點開始遍歷,這種做法的時間複雜度為o(n)。即使採用二叉排序樹進行儲存,也最多為o(logn)。hash表就能夠達到這樣的效果。hash表採用乙個對映函式 f : key —>

address 將關鍵字對映到該記錄在表中的儲存位置。複雜度直接降到o(1)

hash函式的設計

1)直接定址法

取關鍵字或者關鍵字的某個線性函式為hash位址,即address(key)=a*key+b;如知道學生的學號從2000開始,最大為4000,則可以將address(key)=key-2000作為hash位址。

2)平方取中法

對關鍵字進行平方運算,然後取結果的中間幾位作為hash位址。假如有以下關鍵字序列,平方之後的結果為,那麼可以取作為hash位址。

3)摺疊法

將關鍵字拆分成幾部分,然後將這幾部分組合在一起,以特定的方式進行轉化形成hash位址。假如知道圖書的isbn號為8903-241-23,可以將address(key)=89+03+24+12+3作為hash位址。

4)除留取餘法

如果知道hash表的最大長度為m,可以取不大於m的最大質數p,然後對關鍵字進行取餘運算,address(key)=key%p。

在這裡p的選取非常關鍵,p選擇的好的話,能夠最大程度地減少衝突,p一般取不大於m的最大質數。

即使再高效的雜湊鍵值生成函式也是有可能發生碰撞

1.開鏈法

當碰撞發生時,我們仍然希望將鍵儲存到通過雜湊演算法產生的索引位置上,但實際上,不可能將多份資料儲存到乙個陣列單元中。開鏈法是指實現雜湊表的底層陣列中,每個陣列元素又是乙個新的資料結構,比如另乙個陣列,這樣就能儲存多個鍵了。即使兩個鍵雜湊後的值相等,依然被儲存在同樣的位置,只不過它們在第二層陣列中的位置不一樣罷了。

2.線性探測法

線性探測法屬於一種更一般化的雜湊技術:開發定址雜湊。當發生碰撞時,線性探測發檢測雜湊表中的下乙個位置是否為空。如果為空,就將資料存入該位置;如果不為空,則繼續檢查下乙個位置,直到找到乙個空的位置為止。該技術是基於這樣乙個事實:每個雜湊表都會有很多空的單元格,可以使用它們來儲存資料。

採用線性探測法的時候,先給hashtable類初始化乙個儲存值的陣列values = ; 儲存鍵值使用table = ;

如果陣列的大小是待儲存資料個數的1.5倍,那麼使用開鏈法;如果陣列的大小是待儲存的資料的2倍及兩倍以上,那麼使用線性探測法

資料結構和演算法

判斷乙個演算法的效率時,函式中的常數和其它次要項常常可以忽略,而更應該關注主項 最高項 的階數。演算法時間複雜度的定義 在進行演算法分析時,語句中的執行次數t n 是關於問題規模n的函式,進而分析t n 隨n的變化情況並確定t n 的數量級。演算法的時間複雜度,也就是演算法的時間量度,記作 t n ...

資料結構和演算法

程式是什麼?好多書上都寫著 程式 資料結構 演算法。可是怎麼去理解呢?好多程式設計人員對資料結構和演算法說不上熟悉,因為在他們所從事的工作中很少用到這些知識點。但並不表示他們不重要。還有一些人是這樣的想法 大公司才會注重這些知識點,小公司可能就不注重了。寫這篇文章之前我也是持這種想法的。但是,此時此...

資料結構和演算法

一 資料結構 1.概念 資料結構就是資料之間的結構關係,或者理解成資料元素之間存在的一種或者多種特定關係的集合,在傳統上資料結構分為邏輯結構與物理結構 1 邏輯結構 只反映資料元素之間的邏輯關係的資料結構,其中的邏輯關係是指資料元素之間的前後關係,而與他們在計算機中的儲存位置無關,有以下四類 集合結...