日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

快速排序两种最基本思路

發(fā)布時(shí)間:2023/12/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速排序两种最基本思路 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基本思想

快速排序是對(duì)冒泡排序的一種改進(jìn)
基本思想:

  • 通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分。
  • 其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小。
  • 然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序可以遞歸進(jìn)行,一次整個(gè)數(shù)據(jù)變成有序序列
    注意:
    其主要運(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

    ij
    61259347108

    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

    ij
    61254397108

    最終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)。

    012345678
    2315378922143956
    i=0<-- j=8
    *

    第二步:
    從j向左尋找比key小的數(shù),找到后填入坑中,此時(shí)j所在的位置就變成坑了。
    i開(kāi)始向右移動(dòng)

    012345678
    915378922143956
    i=0 -->j=7
    *

    下一步:
    i從左往右移動(dòng),尋找比key大的數(shù),找到后填入坑中,并且i此時(shí)所在的位置就變成了坑。
    j開(kāi)始向右移動(dòng)。

    012345678
    9153789221433756
    i=2<-- j=7
    *

    下一步:
    j從右往左移動(dòng),尋找比key小的數(shù),找到后填入坑中,并且j此時(shí)所在的位置就變成了坑。
    i開(kāi)始向右移動(dòng)。

    012345678
    9152189221433756
    i=2 -->j=5
    *

    下一步:
    i從左往右移動(dòng),尋找比key大的數(shù),找到后填入坑中,并且i此時(shí)所在的位置就變成了坑。
    j開(kāi)始向左移動(dòng)。

    012345678
    9152189289433756
    i=3<-- j=5
    *

    下一步:
    j從右往左移動(dòng),尋找比key小的數(shù),找到后填入坑中,并且j此時(shí)所在的位置就變成了坑。
    i開(kāi)始向左移動(dòng)。

    012345678
    915212289433756
    i=3 -->j=4
    *

    i向右移動(dòng),此時(shí)與j相遇 i = j = 4.

    012345678
    915212289433756
    i = j=4
    *
    012345678
    9152122389433756
    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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。