快速排序(C語言)

2021-09-25 18:59:56 字數 2192 閱讀 1772

效能分析

分治法

從數列中取出乙個數作為基準數,一般取第乙個數

將大於等於這個數的數全放在他的右邊,小於等於它的數全放在他的左邊

再對左右區間重複第二步,直到各區間只有乙個數。

快排的核心思想是partition,對於實現partition有兩種方法:交換法和「挖坑填數法」(後者執行的次數少)

快速排序可以用遞迴和非遞迴的形式實現。

#include

#define debug

/* //交換法實現的quicksort

void swap(int *a, int *b)

void quicksort(int arr, int left, int right)

swap(&arr[left], &arr[i]);

quicksort(arr, left, i-1);

quicksort(arr, i+1, right);

} */

//挖坑填數法實現的quicksort

void

quicksort

(int arr,

int left,

int right)

arr[i]

= key;

#ifdef debug

int k;

for(k = left; k <=right; k++

)printf

("arr[%d]=%d "

, k, arr[k]);

printf

("\n");

#endif

quicksort

(arr, left, i-1)

;quicksort

(arr, i+

1, right);}

intmain()

quicksort

(arr,

0, len-1)

;printf

("quicksort:\n");

int i;

for(i=

0; i)printf

("%d "

, arr[i]);

printf

("\n");

return0;

}

#include

//分隔 用"挖坑填數法"實現

intpartition

(int arr,

int left,

int right)

arr[i]

= key;

int k;

for(k = left; k <=right; k++

)printf

("arr[%d]=%d "

, k, arr[k]);

printf

("\n");

return i;

}//非遞迴實現快排

void

quicksort

(int arr,

int len)

;//用於存放左右索引

int n =0;

//記錄當前b中的索引數目

int index;

b[n++

]= left;

//該思路來自於用c++用棧來實現非遞迴快排,c語言中沒有棧這種資料結構

b[n++

]= right;

while

(n !=0)

if(index +

1< right)}}

intmain()

quicksort

(arr, len)

;printf

("quicksort:\n");

int i;

for(i=

0; i)printf

("%d "

, arr[i]);

printf

("\n");

return0;

}

快排的時間效能取決於遞迴的深度

最優情況,排序n個關鍵字,遞迴樹深度為log

2n

log_2n

log2​n

快速排序C語言

就感覺,自己對這些個排序.至少,腦袋裡還沒有.哎,我老是不專心呢.加油吧.說說快速排序吧.這東西,原理就是不斷地將乙個陣列分成3部分.保持所有陣列處在這種狀態,最終完成排序.這些思想,還沒有掌握.加油吧,我還能說什麼?說些這個,呵呵.這段 起初不懂.後來,隨著不斷手工模擬,發現,採用了很多技巧.也難...

C語言 快速排序

1.快排是對氣泡排序的一種改進,在快速排序中,元素的比較和移動是從兩端向中間進行的,關鍵碼較大的元素一次就能從前面移動到後面,關鍵碼較小的元素一次就能從後面移動到前面,元素移動距離的較遠,從而減少了總的比較次數和移動次數 2.快速排序是基於分治法設計的,其分治策略是 劃分 選定乙個元素作為軸值,以軸...

快速排序 C語言

快速排序 基本思想是 1.分解 分為比基準元素小的 基準元素 比基準元素大的 三部分 2.遞迴求解 3.合併 include include define n 1000 define max 100 int a n void swap int i,int j int patition int p,i...