演算法導論 快速排序

2021-08-21 07:01:59 字數 1122 閱讀 2184

昨天阿里3面,被問了快速排序,我看看之前的部落格,這個排序漏了

快排的基本思想:

1.分而治之的思路,選取乙個哨兵節點

2.將小於key的元素放在哨兵的左邊,將大於key的元素放在右邊

快排的時間複雜度為on(logn),最差的情況為o(n2),即所有元素都是有序的。每次只能走一位元素。

快排是不穩定的演算法,無法保證相等兩個元素的位置是原來的先後順序

/**

* created by tj on 2018/7/8.

*/public

class

sort

if(start//一次遍歷結束,獲得第乙個大於的元素與第乙個小於的元素,接著下一輪,直到start==last

}a[last]=key;

return last;

}public

void

quicksort(int a,int left,int right)

}public

static

void

main(stringargs);

newtest.quicksort(a,0,8);

for(int i=0;i<9;i++)

}}

執行結果:

1 2 3 4 5 5 6 7 9

演算法分析:

根據哨兵節點,在左側獲得比其大的元素位置i,賦值給右側值;

對右側遍歷,獲得小於哨兵元素位置j,賦給i

一次遍歷完成兩個元素的位置交換

partition也可以換成:

int partition(int a,int left,int right)

while(start=key)

//從前面與後面分別找,找到後前後進行交換元素

if(start}

//將正確的值入位

a[right]=a[last];

a[last]=key;

return

last;

}

後面這個演算法雖然比較直觀,直接找到小於與大於的元素,然後交換

在迴圈結束後,將哨兵放入正確的位置。

但多了幾步賦值過程

快速排序 演算法導論

對於包含n個數的輸入陣列來說,快速排序是一種最壞情況時間複雜度為o n 的排序演算法。雖然最壞情況時間的複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能非常好 它的期望時間複雜度是o nlgn 而且o nlgn 中隱含的常數因子非常小,另外,它還能夠進行原址排序,甚至在虛存環...

演算法導論 快速排序

既然敢叫 快速排序 必然有其過人之處。事實上,它確實是最快的通用內部排序演算法。它由hoare於1962年提出,相對歸併排序來說不僅速度快,並且不需要輔助空間。對於包含n個數的輸入陣列來說,快速排序是一種最壞情況時間複雜度為o n 2 的排序演算法。雖然最壞情況時間複雜度差,但是快速排序通常是實際排...

《演算法導論》 快速排序

最近和朋友聊天,聊到企業面試時考了一道鍊錶的快排,這道題在leetcode上也刷到過,而且對於陣列的快排,真是從大學到研究生一直都要求必須掌握的重點知識,然而自己不斷的思考,卻發現所謂的快排,比我以前想象的要複雜的多,因為快排的思想非常幹練,但是形式,或者說具體實現千變萬化,為了達到萬變不離其宗,筆...