演算法 排序演算法整理 快速排序

2021-10-09 09:31:35 字數 1682 閱讀 9383

快速排序是在氣泡排序的基礎上改進而來的,氣泡排序每次只能交換相鄰的兩個元素,而快速排序是跳躍式的交換,交換的距離很大,因此總的比較和交換次數少了很多,速度也快了不少。

快速排序的演算法思想稍微有點複雜,但是還是比較容易理解的。

快速排序的思想就是挖坑填坑+分治法

比如下面這個陣列,我們首先選擇乙個基準數,我們就選擇第乙個數作為基準數,然後我們要在這個陣列裡面找到乙個,把72這個數填進去,使得72的左邊全部都是比72小的數,72的右邊全部都是比72大的數。

那現在我們開始來找這個坑。

首先我們定義int x=s[0]=72,i=0,j=9。

由於我們已經將s[0]中的數儲存在了變數x中,那麼就可以看做s[0]現在是乙個坑,我們要找到乙個數把這坑填上。

因為左邊小右邊大,所以我們要找的這個數肯定是比72小的數。

所以我們從j=9開始遍歷,發現s[8]比x小,我們就把s[8]的數填到s[0]中。

接著s[8]就是我們新挖的坑了,我們要找到乙個數把s[8]填上。我們從i=0開始遍歷,找到了s[3]比x要大,我們把s[3]中的數填到s[8]中,如下圖所示

接下來我們重複上面的過程,直到i>=j時,我們把72填入i的位置,這樣72左邊的數都大於72,72右邊的數都小於72了

接下來再採用分治的思想,把0到4和6到9的數分別按照上面的方法排序,即可對整個陣列完成排序。

這裡我們之所以要維護i,j兩個指標,有兩個原因。

第乙個原因是我們要保證前面的數永遠都是小的後面的數永遠都是大的,所以我們用兩個指標去交替遍歷這個陣列,在i的指標中遇到比x大的數,就讓他填到後面的位置,在j的指標中遇到比x小的數,就讓他填到前面的位置。

第二個原因是我們要找出基準數x的位置,通過兩個指標的交替遍歷,當兩個指標相交的時候,就可以找到基準數x的位置,把他填入即可。

void

quksort

(vector<

int>

& v,

int f,

int b)

v[i]

= x;

quksort

(v, f, i)

;quksort

(v, i +

1, b);}

}

快速排序是在氣泡排序的基礎上改進得來的,氣泡排序每一次只能交換兩個相鄰的數,而快速排序可以進行跨度很大的交換,因此提高了效率。

但是快速排序在最壞的情況下的時間複雜度和氣泡排序一樣,都是o(n^2)

但是在平均情況下,快速排序的時間複雜度是o(nlogn),並且快速排序在大多數情況下,都要快於這個時間複雜度。

在同複雜度的排序演算法下,快速排序的平均速度是最快的,所以這個演算法被取名叫做快速排序

排序演算法整理 快速排序

public static void quick sort int arr int l,int r quick sort arr,l,j quick sort arr,j 1,r 快排的思路 首先一組資料 找乙個基準數 這裡選用陣列的第一位做基準資料 之後i從前往後掃,找到乙個大於 或等於 基準資料...

排序演算法整理小結(快速排序)

說到快速排序演算法,可能我們會了解到其最壞的執行時間為o n n 但是對於其平均效能為o nlgn 正是這一點使得其被廣泛的使用,另乙個重要的特點就是,其能夠進行原地排序,能夠盡可能的減少空間的占用,盡可能的減小演算法使用的空間。說了這麼多理由,那麼到底是怎麼一回事,或者到底是怎麼樣的呢?其核心部分...

排序演算法 快速排序演算法

網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...