用C語言編寫通用氣泡排序函式

2021-09-11 03:51:33 字數 2849 閱讀 4398

一、首先明確如何用氣泡排序法對乙個整型陣列元素進行排序:

注:此處為公升序排列,**詳見文章「用氣泡排序法對陣列中的元素排序

二、

base為乙個無型別的指標變數,用於接收在主函式中傳給此排序函式位址;

num表示需要排序的元素個數;

width表示每個元素的寬度,即所佔的位元組個數;

cmp是乙個指向函式的指標,即函式指標,其指向的函式引數型別為(const void* e1, const void* e2)),返回值為int,因此cmp用於接受這個函式的位址;

swap((char*)base+widthj, (char)base+width*(j+1), width);此函式功能為將每兩個元素按位元組交換,傳遞的實參為要交換的兩元素各自的位址和元素的寬度,即位元組數。

void my_qsort(void* base, size_t num, size_t width, int (*cmp)(const void* e1, const void* e2))

} }}

三、int_cmp()函式兩個形參接收my_qsort()函式中呼叫此函式時傳遞過來的兩元素的位址,這兩個位址型別均為void*

int int_cmp(const void* e1, const void* e2)

將e1和e2這兩個引數均強制型別轉換為int*,此時兩引數是步長為4個位元組的指標,分別解引用即可得到兩元素的值,返回第乙個元素減第二個元素的值:

為負數或0,不交換;

為正數,交換;

交換與否由my_sort()函式中的條件決定:返回值為正,呼叫swap()函式交換

四、swap()函式

將傳過來的兩元素各自的位址強制型別轉換為char* 型別的指標,指標的步長變為1個位元組,給其+i,則跳過i個位元組,每兩個元素按位元組交換,寬度width是乙個元素所佔的位元組數,因此寬度決定了兩個元素按位元組交換要交換多少次

void swap(void* p1, void* p2, size_t width)

}

按位元組交換後即等價於將兩元素直接交換

五、測試對int型陣列的排序

void test_int()

; size_t num = sizeof(arr) / sizeof(arr[0]);

size_t width = sizeof(arr[0]);

my_qsort(arr, num, width, int_cmp);//傳函式名cmp,用乙個函式指標接收

for (i = 0; i < num; i++)

}

六、測試對結構體陣列的同型別成員的排序其struct_cmp()函式為:

int struct_cmp(const void* e1, const void* e2)

宣告乙個結構體:

struct stu ;

void test_struct()

,, };

size_t i = 0;

size_t num = sizeof(stu) / sizeof(stu[0]);

size_t width = sizeof(struct stu);

my_qsort(stu, num, width, struct_cmp);

for (i = 0; i < num; i++)

return 0;

}

七、主函式

void main()

八、完整**如下

#include#include#includestruct stu ;

int int_cmp(const void* e1, const void* e2)

int struct_cmp(const void* e1, const void* e2)

void swap(void* p1, void* p2, size_t width)

}void my_qsort(void* base, size_t num, size_t width, int (*cmp)(const void* e1, const void* e2))

} }}void test_int()

; size_t num = sizeof(arr) / sizeof(arr[0]);

size_t width = sizeof(arr[0]);

my_qsort(arr, num, width, int_cmp);//傳函式名cmp,用乙個函式指標接收

for (i = 0; i < num; i++) }

void test_struct()

,, };

size_t i = 0;

size_t num = sizeof(stu) / sizeof(stu[0]);

size_t width = sizeof(struct stu);

my_qsort(stu, num, width, struct_cmp);

for (i = 0; i < num; i++)

return 0;

}void main()

九、執行結果

C語言氣泡排序函式

氣泡排序演算法的原理如下 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。氣泡排序...

C語言 氣泡排序函式

比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。對arr進行排序,排成公升序 int...

C語言 模擬實現通用氣泡排序

函式原型 void qsort void base,size tnum,size twidth,int cdecl compare const void elem1,const void elem2 以上原型是msdn中查詢出的qsort函式,共有四個引數 各個引數 1 base 待排序陣列首位址 ...