資料結構演算法爬坑日記八

2021-10-23 16:40:43 字數 3133 閱讀 5475

思想:通過一次排序將一組資料分為兩部分,一部分全部比另一部分小,然後對兩部分分別再進行快排,迴圈此操作,直到不能再分割,便得到乙個有序序列

**實現

//快速排序

public

class

quicksort

;sort

(arr,

0, arr.length -1)

; system.out.

println

(arrays.

tostring

(arr));

}public

static

void

sort

(int

arr,

int left,

int right)

//直到找到右邊的乙個不大於中間值的數退出

while

(arr[r]

> middle)

//交換找到的兩數

temp = arr[l]

; arr[l]

= arr[r]

; arr[r]

= temp;

//當左下標大於等於右下標時,退出迴圈

//如果改為==時,當出現左右下標指向最後兩個數且等於中間數得情況下便出現死迴圈

if(l >= r)

//如果交換之後左邊得數等於中間數,右下標後移

//如果不加當兩邊同時出現與中間數相等得情況便會死迴圈

if(arr[l]

== middle)

//如果交換之後右邊得數等於中間數,左下標前移

if(arr[r]

== middle)

}//使已經確定得中間數字置不在發生改變

if(l == r)

//向左遞迴

if(left < r)

//向右遞迴

if(right > l)}}

八百萬資料測試1s到2s

歸併排序採用分治策略將問題分成一些小問題然後遞迴求解,將需要排序的一組資料,分成左右兩部分,對左右兩

部分分別再分成左右兩部分直到無法分割,然後逐層回退到上一層將小部分合成大部分,在合的時候排成有序數列,

直到恢復到原來的規模,則排序結束

**實現

//歸併排序

public

class

mergetsort

;int

temp =

newint

[arr.length]

;mergetsort

(arr,

0, arr.length -

1, temp)

; system.out.

println

(arrays.

tostring

(arr));

}//分

public

static

void

mergetsort

(int

arr,

int left,

int right,

int[

] temp)

}//合 arr原陣列 left合併的左下標 right合併的右下標 temp中間陣列 midden 中間索引

public

static

void

merget

(int

arr,

int left,

int right,

int[

] temp,

int midden)

else

index++;}

//退出迴圈時說明左右有乙個數列已經遍歷結束,此時將有值的數列剩下的數填充到中間陣列

while

(l <= midden)

while

(r <= right)

//將中間陣列資料填充到原來陣列對應位置,不一定是從頭到尾填充中間陣列的資料

//數量應該與需要合併的兩個數列的左右索引的差相等

index =0;

int arrleft = left;

while

(arrleft <= right)}}

八百萬資料測試1s到2s

基數排序屬於分配式排序,是桶排序的乙個擴充套件,通過各個位的值將要排序的元素分配到某些桶中,以達到排序效

果,屬於穩定性排序

思路:將需要排序的數列依次按照個位、十位.

..放入不同的桶中,迴圈往復,直到按照最大位數排序完,演算法結束,

此時的結果即為排序後的結果

**實現(不考慮負數的正序排序)

//基數排序

public

class

radixsort

;sort

(arr);}

public

static

void

sort

(int

arr)

}int maxlength =

(max +"")

.length()

;//最大值的位數

//將資料先按照個位大小依次放入桶中,然後十位,依次迴圈

for(

int i =

0, n =

1; i < maxlength; i++

, n *=10)

//將桶中資料重新放回原陣列

int index =0;

//遍歷每乙個桶

for(

int j =

0; j < bucketelementcount.length; j++)}

//將存放桶元素數量的的陣列清空

bucketelementcount[j]=0

;}system.out.

println

("第"

+(i +1)

+"輪排序之後"

+ arrays.

tostring

(arr));

}}}八百萬資料測試平均1s多,比歸併和快排稍快一點點

典型的一種空間換時間的排序演算法 當測試資料八千萬時,出現記憶體不如的異常

資料結構演算法爬坑日記一

線性結構 最常用的資料結構,特點是資料元素之間存在一對一的線性關係 分倆種儲存結構 1.順序儲存結構 又稱為順序表,儲存元素是連續的 2.鏈式儲存結構 又稱為鍊錶,儲存元素不一定是連續的,元素節點中存放資料元素以及相鄰元素的位址結構 常見線性資料結構 陣列 佇列 鍊錶 棧 非線性結構 常見二維陣列 ...

資料結構演算法爬坑日記六

回溯法 也叫向前試探法,試著尋找正確的求解,當探索到某一步不符合規則時,便回退到上一步進行重新選擇,直到獲取預期的解法 問題描述 在8 8的西洋棋棋盤上,放置八個皇后且八個皇后不能互相攻擊 思路 先將第乙個放在第一行第一列,然後將第二個放在第二行第一列,檢查是否滿足規則,如果滿足則進入第三個的放 置...

資料結構演算法爬坑日記十

雜湊表 也叫雜湊表,通過將關鍵碼值對映到表中的乙個位置來訪問,加快查詢的速度,對映函式也叫雜湊函式,存放記錄的陣列叫雜湊表,在對一些不常改變的資料進行操作的時候,為了加快速度,通常會採用快取技術將其載入 到記憶體中進行操作,而不直接對資料庫進行操作,如redis,雜湊表就相當於乙個簡化版redis,...