快速排序两种最基本思路
基本思想
快速排序是對冒泡排序的一種改進
基本思想:
注意:
其主要運用了分治的思想
有不同種方法將該段數據分成兩段(小于等于key的一段在一邊,大于key的一段在一邊,key的數據在這兩段段中間)
快排一次只能把一個數排好,放在正確的位置。
key可以選最左邊的數,此時先移動右邊的數j,
key也可以選最右邊的數,此時先移動左邊的數i
快速排序主要有兩種方法,一種是標準算法,另一種是兩頭交換法,基本思想是一樣的,但有些細節上有所不同。
方法一:兩頭交換法
過程圖解:
首先我們選取最左邊的數為標準數key,再設最左邊的數為i,設最右邊的數為j.注意此時從右邊開始移動。
key = 6
j從右向左移動直到找到比key小的那個數停下
i從左往右移動直到找到比key大的數停下。
交換它們兩個。
即6 1 2 5 9 3 4 7 10 8
| 6 | 1 | 2 | 5 | 9 | 3 | 4 | 7 | 10 | 8 |
key = 6
繼續進行上面的操作,
j從右向左移動直到找到比key小的那個數停下
i從左往右移動直到找到比key大的數停下。
然后交換它們兩個。
6 1 2 5 4 3 9 7 10 8
| 6 | 1 | 2 | 5 | 4 | 3 | 9 | 7 | 10 | 8 |
最終j找到比key小的數停下
i繼續向前尋找時與j相遇。
此時交換這個數與key的位置。
即3 1 2 5 4 6 9 7 10 8
可以看出來key此時所處的位置,前面都是比key小的,后面都是比key大的。所以這里就是key的位置
然后分別對6前半段和后半段進行上面的排列
最終排序完成。
代碼實現:
int a[100]; void quicksort(int left, int right); int main() {int n;scanf("%d",&n);for(int i = 0; i < n; i++) {scanf("%d ",&a[i]);}quicksort(0, n-1);for(int i = 0; i < n; i++) {printf("%d ",a[i]);}return 0; } void quicksort(int left, int right) {int i, j, t;if(left > right) {return ;}int key = a[left];i = left;j = right;while ( i != j) {while (a[j] >= key && i < j) {j--;}while (a[i] <= key && i < j) {i++;}if(i < j) {t = a[i];a[i] = a[j];a[j] = t;}}a[left] = a[i];a[i] = key;quicksort(left, i-1);quicksort(i+1, right); }方法二:標準算法(填坑法)
優化不必要的交換,直接進行替換操作,不進行交換。
key=23
第一步,i=0, j=8.選取基準數key為23.
可以想象成i = 0那個位置有一個坑,標記為*
j開始向左移動。
| 23 | 15 | 37 | 89 | 2 | 21 | 43 | 9 | 56 |
| i=0 | <-- j=8 | |||||||
| * |
第二步:
從j向左尋找比key小的數,找到后填入坑中,此時j所在的位置就變成坑了。
i開始向右移動
| 9 | 15 | 37 | 89 | 2 | 21 | 43 | 9 | 56 |
| i=0 --> | j=7 | |||||||
| * |
下一步:
i從左往右移動,尋找比key大的數,找到后填入坑中,并且i此時所在的位置就變成了坑。
j開始向右移動。
| 9 | 15 | 37 | 89 | 2 | 21 | 43 | 37 | 56 |
| i=2 | <-- j=7 | |||||||
| * |
下一步:
j從右往左移動,尋找比key小的數,找到后填入坑中,并且j此時所在的位置就變成了坑。
i開始向右移動。
| 9 | 15 | 21 | 89 | 2 | 21 | 43 | 37 | 56 |
| i=2 --> | j=5 | |||||||
| * |
下一步:
i從左往右移動,尋找比key大的數,找到后填入坑中,并且i此時所在的位置就變成了坑。
j開始向左移動。
| 9 | 15 | 21 | 89 | 2 | 89 | 43 | 37 | 56 |
| i=3 | <-- j=5 | |||||||
| * |
下一步:
j從右往左移動,尋找比key小的數,找到后填入坑中,并且j此時所在的位置就變成了坑。
i開始向左移動。
| 9 | 15 | 21 | 2 | 2 | 89 | 43 | 37 | 56 |
| i=3 --> | j=4 | |||||||
| * |
i向右移動,此時與j相遇 i = j = 4.
| 9 | 15 | 21 | 2 | 2 | 89 | 43 | 37 | 56 |
| i = j=4 | ||||||||
| * |
| 9 | 15 | 21 | 2 | 23 | 89 | 43 | 37 | 56 |
| key | ||||||||
| * |
此時key 23所在的位置就是它在排列中應該在的位置。前面的數都是比他小的數,后面都是比它大的數。
最后我們對以上的操作進行分治,即分別對23前面的數列和后面的數列進行上面的操作排序。
最終排序完成。
代碼實現:
#include<stdio.h> int a[100]; void quicksort(int a[], int low, int high) {int i = low;int j = high;int key = a[low];while (i < j) {while (i < j && a[j] >= key) {j--;}if( i < j) {a[i] = a[j];}while (i < j && a[i] < key) {i++;}if( i < j) {a[j] = a[i];}}a[i] = key;if(low < i) quicksort(a, low, i-1);if(high >i) quicksort(a, i+1, high); }int main() {int n;scanf("%d",&n);for(int i = 0; i < n; i++) {scanf("%d ",&a[i]);}quicksort(a, 0, n-1);for(int i = 0; i < n; i++) {printf("%d ",a[i]);}return 0; }總結
以上是生活随笔為你收集整理的快速排序两种最基本思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自发光材质
- 下一篇: shader流光+自发光