快速排列法(簡易版 複雜版)

2021-09-29 21:02:50 字數 2504 閱讀 5729

前言:

快速排列,作為效率最高、速度最快的排列方式,我理應詳細了解它,但是又由於它的表達方式過於多樣,導致我只能理解最簡單的一種,然而我刷題時卻遇到了它的高階表達方式,這使我不得不面對它的其他表達方式,也是時候使我真正的了解它了

?先了解一下什麼是快速排列法

快速排列法的實質為:氣泡排序法的改進

為什麼說實質為氣泡排序法的改進?因為與氣泡排序相比,每次的交換是跳躍式的,每次排序的時候設定乙個基準點,將小於等於基準點的數全部放到基準點的左邊,將大於等於基準點的數全部放到基準點的右邊。這樣在每次交換的時候就不會像氣泡排序一樣每次只能在相鄰的數之間進行交換,交換的距離就大的多了。因此總的比較和交換次數就少了,速度自然就提高了(通常為了方便,以第乙個數作為基準數)

以函式的形式補充幾點(從小到大)

void

qsort

(int a,

int begin,

int end) 可以選擇要排序的位置

a[begin]

= a[i]

; 此時 i 與 j 位於同一位置,將此元素與基準點交換位置

a[i]

= tmp; (如果看不懂可以將這兩個表示式與上面的 tmp 賦值一起看,

相當於tmp充當臨時變數,為了使位於同一位置的元素與基準點交換位置)

qsort

(a, begin, i -1)

; 左邊再來一遍

qsort

(a, i +

1, end)

; 右邊再來一遍

}

警示:裡面兩個 while 的位置不能換,因為基準點是位於左邊的, j 會先跑到 i 的位置,因此 i 和 j 一定會同時處於小於等於基準點的元素上(避免於基準點交換位置之後,左邊出現比基準點大的元素)

注意兩個while中是 >= 與 <= ;還有最後記得代入的是位置(begin),而不是元素( a [begin] )

更詳細的說明在這裡快速排序法(詳解),這篇部落格可能更適合初學者叭~

#include

void

swap

(int a,

int i,

int j)

intpartition

(int a,

int p,

int r) 分割槽並返回中間位置

swap

(a, p, j)

; 基準點元素 與 a[j]元素 進行交換

return j;

}void

quicksort

(int a,

int p,

int r)

}int

main()

;int n =

sizeof

(a)/

sizeof

(a[0])

;quicksort

(a,0

, n -1)

;for

(i =

0; i < n; i++

)printf

("%d "

, a[i]);

printf

("\n");

return0;

}

複雜版的主要思路在於分治,即大事化小,它把排列的主要過程分為三個函式,使其分別巢狀:

:quicksort( int a[ ], int p, int r ) 函式負責重複遞迴,即讓陣列重複迭代

:int partition( int a[ ], int p, int r ) 函式負責排列,並返回中間位置使其左右陣列重新進入遞迴中

最後:swap( int a[ ], int i, int j ) 函式負責交換陣列下標對應的值

難點

1、int partition( int a[ ], int p, int r ) 函式即負責排列,又負責返回中間位置很難想到

2、在int partition( int a[ ], int p, int r ) 函式中先是 ++ i 再是 - - j,這與簡易版的相反,但卻能保證 j 的位置元素保證小於等於基準點,是因為有兩種情況(要麼是 i 先到了 j 的左邊一格, j 再左進一格與 i 重合,符合;要麼 i 向右一格與 j 重合,j 再左進一格到 i 的左邊一格,j 的值絕對小於基準點,符合)

3、是因為只有 j 小於等於基準點才將 j 作為中間值傳給遞迴函式,兩者能如此結合也是很難想到

最後悄悄說一句:複雜版其實是藍橋杯省賽原題

檔案上傳簡易版

以下是index.jsp的核心 後台servlet核心 先獲取所接收檔案要儲存的路徑 string path getservletcontext getrealpath imgs 檔案上傳需要臨時目錄 如果不指定,那麼該目錄就是tomcat temp file tempdir new file d ...

許可權設定(簡易版)

我們有乙個表actions是用來設定對選單或者資料進行增刪改查,預覽審核等等許可權的二進位制值,許可權判斷採用二進位制比較,例如乙個使用者對入庫表的action二進位制值為110,10為預覽,110 10 010 那麼他有預覽的許可權 欄位名描述 menu name 選單名dataset name ...

簡易版推箱子

最近學了一些c語言的視覺化程式設計,因此編了小遊戲玩玩,途中也遇到了一些問題,要記得放的時候要把存在資料夾裡,這些可以只寫相對路徑,不然如果直接寫相對路徑而又忘記把放在資料夾裡就不能夠顯示出想要的結果。廢話了這麼多,是時候上 了 include include includeimage backim...