排序 快速排序

2021-10-06 08:58:44 字數 1356 閱讀 3330

一:原理

以乙個數為基準,我們叫它base數,將陣列中的元素以base為參考,大於base的放在base的右邊,小於base的放在base的左邊,這樣就可以找到base在陣列中正確的位置。

二:**分析

public static void fastselcet(int arry,int low,int high)

//設定乙個基礎數,一般設定為陣列第一位,原理就是找到這個base的在陣列中的正確位置,讓base左邊的數全部小於base,base右邊的數全部大於base

int base = arry[low];

//只要左右兩邊的角標沒有遇到一起,就一直迴圈下去

while(low= base)

//從左往右找到乙個比base大的數

while(low首先我們找個乙個基礎數,一般以陣列中的第一位為基礎數,我們叫做base

我們從陣列的高角標處開始,依次向後移動,直到找到第乙個比base小的數,停下來,再從陣列低角標處依次向前移動,直到找到第乙個比base大的數,停下來;

然後交換兩個角標處的值;

交換完值以後,我們繼續開始從剛剛停下來的高角標處往後移動,直到再次找到比base小的數,停下裡;再從剛剛停下來的低角標處往前移,直到再次找到比base大的數,停下來;

然後交換兩個角標處的值

如此繼續重複1,2,3過程,直到兩個角標相遇,此時相遇的角標就是base在陣列中的正確位置。

疑問:為啥要從陣列的高角標處開始查詢,先從低角標處找行不行?

為啥相遇的角標就是base在陣列中的正確位置?

第乙個問題:不行,必須是從右往左先開始

第一種情況:以base為基數,將陣列中的元素小於base的放在左邊,大於base的放在右邊,我們從左往右開始找,看行不行?既然是這樣情況,那麼我們還是需要在左移的過程中找到大於base的數,右移的過程中找到小於base的數,那麼當兩個角標相遇的時候,由於是左邊的角標先停下來的,故兩角標相遇的這個數必然是大於base的,那現在就很尷尬了,base是不能和它交換的,只能和這個角標前面的數交換。

第二種情況:以base為基數,將陣列中的元素大於base的放在左邊,小於base的放在右邊,我們從左往右開始找,看行不行?既然是這樣情況,那麼我們還是需要在左移的過程中找到小於於base的數,右移的過程中找到大於base的數,那麼當兩個角標相遇的時候,由於是左邊的角標先停下來的,故兩角標相遇的這個數必然是小於base的,那現在就很尷尬了,base是不能和它交換的,因為左邊的數全部要大於base,這個數比base還小怎麼能交換到左邊了?只能和這個角標後面的數交換。

第二個問題:當兩個角標相遇時,由於是從右往左移動的,故相遇角標處的值是小於base的,而其它大於base的數已經在while迴圈中交換完畢了,故而此時相遇點就是base的正確角標數。

可以參考:

排序 快速排序

快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...

排序 快速排序

定義 在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。步驟 1.在序列中選擇乙個關鍵元素作為軸 2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上 3.遞迴地對兩個子...

排序 快速排序

時間複雜度 快速排序每次將待排序陣列分為兩個部分 1 在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。2 在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,最壞情況為o n 2 快速排序的平均時間複雜度為o nlogn...