昨天阿里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上也刷到過,而且對於陣列的快排,真是從大學到研究生一直都要求必須掌握的重點知識,然而自己不斷的思考,卻發現所謂的快排,比我以前想象的要複雜的多,因為快排的思想非常幹練,但是形式,或者說具體實現千變萬化,為了達到萬變不離其宗,筆...