一、首先明確如何用氣泡排序法對乙個整型陣列元素進行排序:
注:此處為公升序排列,**詳見文章「用氣泡排序法對陣列中的元素排序」
二、
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 待排序陣列首位址 ...