左神演算法筆記03

2021-10-11 22:52:41 字數 2029 閱讀 4229

可以是函式遞迴,也可以是迴圈實現。

將大的陣列對半分為兩個陣列,每個陣列排好序後再合併為大的陣列。

如果使用迴圈實現,要提防整形溢位

應用:最小和問題,若陣列的左邊的乙個數比右邊的某乙個數小,在返回結果加上自身的大小

public

static

intprocess

(int

arr,

int l,

int r)

public

static

intmerge

(int

arr,

int l,

int m,

int r)

while

(p1 <= m)

while

(p2 <= r)

for(i =

0;i < help.lenth;i++

)return res;

}

相當於每個數都找他的右邊有幾個(n)比他大的數,最終的結果加上n*自身。

因為歸併排序的過程中每個數都進行了等價於原陣列的順序遍歷,所以我們可以得到一些原陣列的特性。

設<=x的初始下標less為l−1

l-1l−

1,對陣列進行遍歷。

如果a rr

[i

]<=x

arr[i]<=x

arr[i]

<=x

,則交換arr[index + 1]和arr[i]位置的數,右擴<=x的範圍,即less++,同時i++

否則只進行i++

int

patition

(int

arr,

int l,

int r,

int num)

return index;

}void

swap

(int a,

int b)

//不能用異或的方式是因為可能有自己跟自己交換的情況

類似上面的做法,設l−1

l-1l−

1,>x的初始下標more為r+1

r + 1

r+1,對陣列進行遍歷。

如果a rr

[i

]<

xarr[i]ar

r[i]

<

x,則交換arr[less + 1]和arr[i]位置的數,右擴arr

[i]=

=x

arr[i] == x

arr[i]

==x,只進行i++

否則交換arr[more]和arr[i]的位置,more–,i不變

int

patition2

(int

arr,

int l,

int r,

int num)

//左神的方法只用三個引數,最後的num預設用arr[r]的值

return

int[

]}

用patition方式進行排序:

void

quicksort1

(int

arr,

int l,

int r)

void

process1

(int

arr,

int l,

int r)

用patition2方式進行排序:

void

quicksort2

(int

arr,

int l,

int r)

void

process2

(int

arr,

int l,

int r)

僅僅在快排2.0的基礎上增加了隨機數,由數學統計可以得出時間複雜度下降。

左神演算法筆記01

對數器異或工具 一些其它的位運算子的操作 簡單理解為 將乙個演算法的所有操作拆成基本操作 常數時間完成的操作 後,計算出操作次數和操作時間 可視為1 的乘積,即操作次數之和。在考慮最差情況時用o 來表示時間複雜度,取最高項來表示。如o n o logn 對n個數進行排列,則最差要進行1 2 3 n ...

左神演算法整理筆記02

引例 利用查詢陣列最大值 思想步驟 public static void sortprocess int arr,int left,int right public static void merge int arr,int left,int mid,int right 當其中有乙個越界的時候 wh...

左神演算法整理筆記05

桶排序對應的很多都是困難題哦 例子 對0 60的陣列進行排序 例子 對應leetcode 164 給定乙個陣列,求如果排序之後,相鄰兩數的最大差值,要求時間複雜度0 n 且要求不能用非基於比較的排序 public intmaximumgap int nums if max min boolean h...