快速排序两种最基本思路
基本思想
快速排序是對(duì)冒泡排序的一種改進(jìn)
基本思想:
注意:
其主要運(yùn)用了分治的思想
有不同種方法將該段數(shù)據(jù)分成兩段(小于等于key的一段在一邊,大于key的一段在一邊,key的數(shù)據(jù)在這兩段段中間)
快排一次只能把一個(gè)數(shù)排好,放在正確的位置。
key可以選最左邊的數(shù),此時(shí)先移動(dòng)右邊的數(shù)j,
key也可以選最右邊的數(shù),此時(shí)先移動(dòng)左邊的數(shù)i
快速排序主要有兩種方法,一種是標(biāo)準(zhǔn)算法,另一種是兩頭交換法,基本思想是一樣的,但有些細(xì)節(jié)上有所不同。
方法一:兩頭交換法
過(guò)程圖解:
首先我們選取最左邊的數(shù)為標(biāo)準(zhǔn)數(shù)key,再設(shè)最左邊的數(shù)為i,設(shè)最右邊的數(shù)為j.注意此時(shí)從右邊開(kāi)始移動(dòng)。
key = 6
j從右向左移動(dòng)直到找到比key小的那個(gè)數(shù)停下
i從左往右移動(dòng)直到找到比key大的數(shù)停下。
交換它們兩個(gè)。
即6 1 2 5 9 3 4 7 10 8
| 6 | 1 | 2 | 5 | 9 | 3 | 4 | 7 | 10 | 8 |
key = 6
繼續(xù)進(jìn)行上面的操作,
j從右向左移動(dòng)直到找到比key小的那個(gè)數(shù)停下
i從左往右移動(dòng)直到找到比key大的數(shù)停下。
然后交換它們兩個(gè)。
6 1 2 5 4 3 9 7 10 8
| 6 | 1 | 2 | 5 | 4 | 3 | 9 | 7 | 10 | 8 |
最終j找到比key小的數(shù)停下
i繼續(xù)向前尋找時(shí)與j相遇。
此時(shí)交換這個(gè)數(shù)與key的位置。
即3 1 2 5 4 6 9 7 10 8
可以看出來(lái)key此時(shí)所處的位置,前面都是比key小的,后面都是比key大的。所以這里就是key的位置
然后分別對(duì)6前半段和后半段進(jìn)行上面的排列
最終排序完成。
代碼實(shí)現(xiàn):
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); }方法二:標(biāo)準(zhǔn)算法(填坑法)
優(yōu)化不必要的交換,直接進(jìn)行替換操作,不進(jìn)行交換。
key=23
第一步,i=0, j=8.選取基準(zhǔn)數(shù)key為23.
可以想象成i = 0那個(gè)位置有一個(gè)坑,標(biāo)記為*
j開(kāi)始向左移動(dòng)。
| 23 | 15 | 37 | 89 | 2 | 21 | 43 | 9 | 56 |
| i=0 | <-- j=8 | |||||||
| * |
第二步:
從j向左尋找比key小的數(shù),找到后填入坑中,此時(shí)j所在的位置就變成坑了。
i開(kāi)始向右移動(dòng)
| 9 | 15 | 37 | 89 | 2 | 21 | 43 | 9 | 56 |
| i=0 --> | j=7 | |||||||
| * |
下一步:
i從左往右移動(dòng),尋找比key大的數(shù),找到后填入坑中,并且i此時(shí)所在的位置就變成了坑。
j開(kāi)始向右移動(dòng)。
| 9 | 15 | 37 | 89 | 2 | 21 | 43 | 37 | 56 |
| i=2 | <-- j=7 | |||||||
| * |
下一步:
j從右往左移動(dòng),尋找比key小的數(shù),找到后填入坑中,并且j此時(shí)所在的位置就變成了坑。
i開(kāi)始向右移動(dòng)。
| 9 | 15 | 21 | 89 | 2 | 21 | 43 | 37 | 56 |
| i=2 --> | j=5 | |||||||
| * |
下一步:
i從左往右移動(dòng),尋找比key大的數(shù),找到后填入坑中,并且i此時(shí)所在的位置就變成了坑。
j開(kāi)始向左移動(dòng)。
| 9 | 15 | 21 | 89 | 2 | 89 | 43 | 37 | 56 |
| i=3 | <-- j=5 | |||||||
| * |
下一步:
j從右往左移動(dòng),尋找比key小的數(shù),找到后填入坑中,并且j此時(shí)所在的位置就變成了坑。
i開(kāi)始向左移動(dòng)。
| 9 | 15 | 21 | 2 | 2 | 89 | 43 | 37 | 56 |
| i=3 --> | j=4 | |||||||
| * |
i向右移動(dòng),此時(shí)與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 | ||||||||
| * |
此時(shí)key 23所在的位置就是它在排列中應(yīng)該在的位置。前面的數(shù)都是比他小的數(shù),后面都是比它大的數(shù)。
最后我們對(duì)以上的操作進(jìn)行分治,即分別對(duì)23前面的數(shù)列和后面的數(shù)列進(jìn)行上面的操作排序。
最終排序完成。
代碼實(shí)現(xiàn):
#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; }總結(jié)
以上是生活随笔為你收集整理的快速排序两种最基本思路的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 自发光材质
- 下一篇: shader流光+自发光