你能夠一次性寫出快速排序並且執行正確嗎?

時間 2021-05-07 13:32:51

1樓:DarrenChan陳馳

你應該問是拿陣列寫還是單鏈表寫?要是單鏈表你還能用相向雙指標嗎?能寫出quick sort那你能寫出quick select嗎?

它們之間的時間複雜度為啥乙個是nlogn乙個是n?quick sort裡面蘊含的演算法思想是啥?這是分割槽型別的相向雙指標,用這種思想還能解什麼問題?

leetcode上奇偶分割,交錯正負數至少都用了這種思想。這種思想優勢是啥,是否能保證最少交換次數?這種演算法的限制條件是啥,要是強調維護元素相對順序還能不能用?

哪怕是演算法本身,為什麼用<=,什麼時候用=,你真的明白嗎?

2樓:Scotttttt

能,剛剛複習的時候沒看任何材料無bug寫了出來,雖然稍微有點慢。

public

class

QuickSort3Way

private

static

void

sort

(Comparable

a,intlo

,inthi)

sort(a

,lo,lt

-1);sort(a

,gt+1

,hi);}

private

static

void

swap

(Comparable

array

,inti,

intj)}

3樓:

取固定數作為基準比較好寫

試了下隨機數,除錯了好久

letgetRandomNumber

=function

(start

,end

)let

quickSort

=function

(numbers

)let

length

=numbers

.length

letqueue=[[

0,length-1

]]let

partition

=function

(pivot

,start

,end

)while

(left

&&numbers

[left

]<=pivotNum)if

(left

if(right

&&numbers

[right

]

)let

temp

=numbers

[right

]numbers

[right]=

numbers

[pivot

]numbers

[pivot]=

tempif(

right

-start

>1)if(end-

right

>1)}while

(queue

.length

!==0

)return

numbers}

4樓:両儀

可以,首先按照定義用Haskell寫一遍:

quicksort::(

Orda

)=>[a

]->[a

]quicksort

=quicksort(x

:xs)=

letsmallerSorted

=quicksort

(filter

(<=x)

xs)biggerSorted

=quicksort

(filter

(>x)

xs)insmallerSorted++[

x]++biggerSorted

然後翻譯成Python或者C++什麼的:

vector

quickSort

(vector

vec)

);copy_if(++

vec.

begin

(),vec

.end

(),back_inserter

(right),[

pivot

](const

intx));

left

=quickSort

(left

);right

=quickSort

(right

);out

.insert

(out

.end

(),left

.begin

(),left

.end

());

out.

push_back

(pivot

);out

.insert

(out

.end

(),right

.begin

(),right

.end

());

return

out;

};(這裡就不generic了)

5樓:Trebor

搞一下,不搞了:UTLC,不保證正確性。

並且我發現我定義了一堆不需要的東西……

找時間測試一下,搞成normal form,當我知乎密碼得了(

6樓:原子筆

這個演算法的標準實現其實背後可以推衍一些資訊理論結論,一些偽隨機數生成或偽隨機shuffle演算法(不要小看這幾個東西背後的科學意義),,,我就是多寫了幾遍得出來的上述靈感,值得你去每年寫幾遍,真的。

7樓:

不抖機靈,我能,用C++

畢業前能,現在能,年紀大腦子退化以前應該都能。所有複雜度和快排相當的演算法,仔細一點都可以寫出來一遍過。記得我回答過這個問題:

為什麼說裸寫quicksort能月薪1W?

據說有兩種程式設計師,一種寫程式像做解答題,一種寫程式像做證明題。成為後一種,多練練,你也可以。

之前面試過某些公司在網上海選,演算法題很簡單那種,我都是直接在網頁文字框裡直接寫程式提交的。

8樓:

標準 APL2 寫法,不用擴充套件。R←

QSORTA;

P;U;

E;L→

(1≤A

)/BODY

if null return nullR←A→

0BODY:P

←A[?

A]Random pick pivot

Pick up eq, low, partU←(P

(P=A

)/AL

←(P>A)

/ADo QSORT and assembleR←(QSORTL)

,E,(

QSORTU)

改成 APL with dfns,可以寫成 one-liner,就是只有 Dyalog 支援。

Choose pivot

Selection op abstractiondfns 的 recursive call 用 Del 表示GOTO 可以改成 guard。

Concatenation rule

於是就有了Q←

((

,=S,(

>S))

?}然而不管用不用擴充套件,在 APL 裡要 sort 只要很簡單的

9樓:

誒racket涼到這個程度了嗎?(逃

(define

(qsort

lst)

(match

lst['()

'()]

[(cons

xrest)(

[qsort

(filter

(curry

>=x)

rest)](

list x)

[qsort

(filter

(curry

)])]))

10樓:刺身鹹魚

說實話我第一次寫排序寫了乙個晚上,當時也不知道看書,不知道選擇排序快速排序氣泡排序啥啥啥的!!!!!我用三個for寫了乙個晚上!!!!

11樓:zJui

大學以前可以,我相信很多oier都背過,我是每次賽前檢查機子環境的時候就是寫乙個有io讀寫的快排。

現在可能還記得大概,原理也都懂,但是寫的肯定沒背的快,可能還要試執行一兩次。

12樓:風手

這在高中的oier裡面隨便找乙個都能做到,但前提是Pascal玩家,這幾年幾乎都是c++選手了,大部分水的oier都是用的庫函式。

13樓:iEternity

來個golang版本:

func

qsort

(data

int)

mid:=

data[0

]head

,tail:=0

,len

(data)-

1fori:=

1;i<=

tail

;else

}qsort

(data

[:head

])qsort

(data

[head+1

:])}

14樓:

用erlang,so easy,兩行解決:

qsort() -> ;

qsort([Pivot|T]) -> qsort([X || X <- T, X < Pivot]) ++ [Pivot] ++ qsort([X || X <- T, X >= Pivot]).

有什麼問題?

15樓:

講道理不會寫的人可以說對於演算法就是門外漢吧,只刷過題,不領略演算法設計思想的那種。

這個東西不是熟不熟的問題,關鍵是你只要真正學過(而不是背定義/實現),根本想忘都忘不了吧?而且實現起來根本沒有難度吧?就是掃瞄一遍陣列然後分治吧

void

qsort

(..)

這是不懂遞迴還是不會掃瞄陣列?居然這個東西還能被認為是「高階程式設計師平時不用,不熟悉底層基本演算法,所以不會快速寫出很正常」。有資格被這麼評價的起碼也得是手寫AC自動機平衡樹這種細節確實比較多一些的吧?

16樓:Patrick

估計行吧,給我兩分鐘背一背就好了

python:

f = lambda ll: f([i for i in ll[1:] if i <= ll[0ll[0:

1f([i for i in ll[1:] if i > ll[0if ll else

haskell:

q_sortq_sort (x:xs) = q_sort[a|a<-xs, a>=x]++[x]++q_sort[a|a<-xs, a

17樓:羅宸

一次性寫出:

qsort

::Ord

a=>[a

]->[a

]qsort

=qsort(x

:xs)=

qsort

(filter

(

xs)++x

:qsort

(filter

(>=x)

xs)確保執行正確:

import

Data.List

(sort

)import

Test.Hspec

import

Test.QuickCheck

main

=hspec$do

describe

"qsort"$do

it"works like sort"

$property$\

(xs::[

Int])

->qsort

xs==

sort

xs加個測試結果:

qsort

works

like

sort

+++OK

,passed

1000000

tests

.Finished

in9.5305

seconds

,used

9.5000

seconds

ofCPU

time

1example,0

failures

What's the problem?

18樓:

不能。1.不刻意記憶,排序演算法那麼多,過一陣子不接觸就忘了哪種是快排了。

2.不敢保證自己就算知道演算法也不會出bug。

但這都是無關緊要的問題,如果真的需要寫乙個排序演算法,老碼農大多能臨時設計乙個複雜度還行的演算法出來,除錯除錯bug也就沒了,而且說不定這種演算法的思路就是快排的思路。

19樓:溫酒

菜雞:不能。

高手:能。

大師:我們高階程式設計師對這些基礎的演算法都不大行的。

法爾廷斯:你想知道的東西在《演算法導論》裡面的第x頁,和第y頁,自己去看。

20樓:

const

qsort=xs

=>xs.

length

===0?xs

:[...

qsort(xs

.filter(x

=>x

0])),...xs.

filter(x

=>x===xs[

0]),...

qsort(xs

.filter(x

=>x>xs[

0]))];

醫用一次性口罩能夠應對新型冠狀病毒嗎?

不能喝奶茶呀 可以。醫用口罩和n95有人做資料測試防護飛沫能力相當,日常使用足夠。n95與醫用口罩的區別在於防護效果更好。1是更嚴絲合縫,貼合肌膚 2是防血液噴濺,醫護人員用n95來做手術,可以防止血液噴濺 醫用口罩做不到這點防護 SARS的第乙個患者在醫生搶救的時候咳血滲透後醫生感染 淺顯之見。 ...

你一次性打100個殭屍能活多久?

橋色夫 喬斯達 我本來以為是現實中100殭屍,已經腦補了很多簡單又實用的陷阱。點進來看才知道是mc。題主怕是雲玩家,至少你得給個封閉空間的大小,mc中玩家的跑動速度比殭屍要快很多,這就留了很多的操作空間,但要是你空間太小也沒辦法跑啊。還有版本沒有規定,1.9之後有攻擊CD了,戰鬥方式有明顯變化,先不...

一次性吃了74片藥我能不能夠死掉?

心蓮 跑得了和尚跑不了廟,有問題要面對和解決,而不是用死逃避,活著解決不了的問題,死了問題更大。好比抑鬱的人想用自殺解脫抑鬱,欠了債的人想躲起來逃避追債,實際上是不可能的,這輩子欠人一粒公尺,下輩子很可能要還一斗,因為又產生了利息。所以有句話叫出來混,欠了的總要還,今生不還,下輩子也要還。精神上的痛...