關於快速排序演算法的理解

2021-08-31 07:40:05 字數 1175 閱讀 7171

直接進入正題吧,快排演算法的思想主要是分兩步:

1.使用空間複雜度為1的方法將一堆數中的某個元素找到自己的位置,並且保證左邊的數比自己小(大),右邊的數比自己大(小);

2.將這個堆數左邊所有的數再次當做那堆數放到上面1的方法中,重複,直到代入的這堆數完全有序,完成之後再將將右邊所有的數當做那堆數放到上面的1中直到代入的這堆數完全有序。

就隨便拿網上的乙個演算法來說[1]

初始資料為 :[6,10,13,5,8,3,2,11] 以6為第一步的某個元素,完成第一步之後[2,5,3],[6],[8,13,10,11],第二步則是將[2,5,3],作為乙個陣列放到方法1中,[2,5,3]排序完成之後,再將[8,13,10,11]當做乙個陣列。

第二步很簡單,是典型的遞迴。

個人覺得這個排序演算法比較牛的是第一步,現在我們來想乙個如果給你乙個陣列讓你找到第乙個數的位置(即如果這個陣列有10個,它是第五大,這個時候他的位置就是4),並且保證前面的這個數前面的數都比他小(大),後面的數都比他大(小)。

如果在不限定空間複雜度的話這個演算法還是有很多種的,比如我可以先遍歷一下這個陣列s,在遍歷的過程中將比這個數大的放到乙個陣列中a,將這個數小的放到乙個陣列中b,等遍歷完成之後再將a,s[0],b這三個陣列重新合成乙個陣列;還可以再申請乙個陣列t,先將s[0]放到最後乙個,如果再去遍歷s,在遍歷過程中對s[0]的位置進行調整,並記錄s[0]所在的位置,最後也能保證在s[0]前面的數都比它小(大),在s[0]後面的數都比他大。因為這個演算法比較簡單,我就不舉例說明了。

但是上面的演算法都是額外申請了記憶體的,空間複雜度不為1的。

現在我們來看下官宣的快排是怎麼做的:

依然以上面的數為例:[6,10,13,5,8,3,2,11],拿6做比較,如果先從後面開始比較,如果找到比6小的2,則

將 6和它換個位置,再從另一側開始,這樣做的目的就是保證比較過的數能夠放在合適的位置(放在左邊或者放在右邊),而保證等再一次回到後面這側做比較的時以及比較過的數11就不比較了,從3開始比較,這樣就保證了之前比較的數沒有被破壞順序,等第一輪完成了之後,6就找到了其對應的位置。

1.

快速排序演算法的理解

本文主要是敘述一次快速排序演算法中發生了哪些步驟,以加深對快速排序演算法的理解。通過乙個參照數把整個數列分為大於它的部分和小於它的部分,再分別處理其兩邊的數列,直到結束。1.首先從需要排序的數列中選取乙個參照點,如第乙個資料,即key a low 2.從數列最後一位開始與key進行比對 降序排列 如...

快速排序演算法的理解

快速排序演算法是一種基礎的演算法,主要用到分治和遞迴。這種演算法其實很有意思,有大佬叫它為填坑法。妙就妙在用填坑來形容了,真的是非常形象。從小到大排序為例的話,就是在乙個陣列中設定乙個比較值temp,將比temp值大的放temp的右邊,將比temp值小的放temp的左邊,快排的填坑形象的話,先在陣列...

Java中關於快速排序的理解

在部落格上面看了很多大神的解析,自己慢慢的有了一點思路。首先我認為快速排序就是採用了分治的思想 先找到其中乙個數字作為基準,一般是第乙個,然後找到它在這一組序列中間對應的真正位置,然後以這個數字為分界分為兩組在分別採用一開始找第乙個數字真正位置的方法,分別找到這兩組對應的第乙個數字的位置,然後再分,...