我是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...