C語言快速排序實現方案(面向ACM NOIP)

2021-08-08 23:57:17 字數 2936 閱讀 1360

我是c++選手,但學校要求用c考試,所以來**一下c下快速排序的實現方案。

快排的**實現需要格外注意i與j的邊界情況。回想以往用pascal參加noip的經歷,保證正確性起見,遂把pascal目錄下的/demo/text/qsort.pp翻譯成c貼上。。

#include 

int n,a[100009];

void sort (int* a,int l,int r)

}if (lsort(a,l,j);

if (isort(a,i,r);

}int main ()

順便祭上pascal**

procedure

sort

(l,r: longint);

var i,j,x,y: longint;

begin

i:=l;

j:=r;

x:=a[(l+r) div

2]; repeat

while a[i]do

inc(i);

while xdo

dec(j);

ifnot(i>j) then

begin

y:=a[i];

a[i]:=a[j];

a[j]:=y;

inc(i);

j:=j-1;

end;

until i>j;

if lthen

sort(l,j);

if ithen

sort(i,r);

end;

其實在實際測試(gcc 4.7.2)中發現不引用stdlib.h也可以使用qsort。

相比於c++的algorithm中的sort函式,qsort使用起來要麻煩一些,但速度相對會快那麼一點。

在stdlib.h中qsort的宣告為:

void qsort(void *base, int nelem, unsigned int width, int ( * pfcompare)( const

void *, const

void *));

其中void *base為需要排序的資料的起始位址

int nelem需要排序的元素的個數

unsigned int width為每個元素的大小

int ( * pfcompare)( const void *, const void *)這個是指向比較函式的指標

相比於c++中的sort,多了元素個數、元素大小和必須加上的比較函式

需要說明幾點:

1、void *base通常用陣列名就可以(陣列名相當於陣列第乙個元素的位址,即a<==>&a[0],同理a+1<==>&a[1]

2、int ( * pfcompare)( const void *, const void *)這是個函式指標,下面會提到

3、void *是乙個特殊的指標,下面會提到

4、比較函式的返回值必須是int

函式指標

先區分兩個概念:函式指標指標函式

函式指標是指向函式的指標,指標函式是返回值為指標的函式,這裡只簡單提一下函式指標。

類似陣列名為陣列第乙個元素的位址,函式名為函式的位址。

函式指標指向函式位址,如

int (*f) (int,int);
現在定義乙個函式

int foo (int x,int y)
如果給f賦值f=foo

那麼foo(1,2);<==>(*f)(1,2);<==>f(1,2);

void*指標

void*是一種特殊的指標,它沒有型別,可以被賦值任何型別的位址

但要注意呼叫這種型別時必須加強制型別轉換,而且void*型別不能參與指標運算(gnu中是允許的,而ansi c不允許)

乙個例子

int a;

void* p=&a;

int* x;

x=(int*)p;

比較函式

比較函式的返回值為int,和c++中的比較函式不太一樣(c++中如果是用結構體的話直接過載《就可以實現排序了),這裡假設需要比較的兩個元素為*a和*b

若 *a < *b 則返回值應該小於0

若 *a == *b 則返回值應該等於0

若 *a > *b 則返回值應該大於0

有些類似於strcmp的返回值

理解了這些,就不難看懂qsort的呼叫了:

#include 

int n,a[100009];

int compare (const

void *a,void *b)

int main ()

compare是乙個函式位址,在qsort引用時不用加括號

qsort還可以給結構體排序,示例如下:

#include 

int n,a[100009];

struct data data[100009];

int compare (const

void *a,const

void *b)

int main ()

C語言實現快速排序

快速排序,是氣泡排序的改進,通過尋找 中間元素 在一趟排序中,把比 中間元素 小的數放到左邊,比 中間元素 大的數放到右邊,如此遞迴,最終得到排序結果。include define num 5 void quick sort int a,int left,int right void swap in...

c語言實現快速排序

快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽結束...

快速排序 C語言實現

以前使用rm時,ruby指令碼提供乙個sort函式,可以把陣列進行排序,後來得知採用的演算法是快速排序。隨著資料結構課程的學習,快速排序如今也不再神秘,如下 using namespace std void quicksort int a,int low,int high int first low...