目錄:
? ? ? ? ? ?冒泡排序的原理
? ? ? ? ? ?主函數
? ? ? ? ? ?"冒泡排序函數"
? ? ? ? ? ?比較函數
? ? ? ? ? ?交換函數
? ? ? ? ? ?最終輸出
? ? ? ? ? ?完整代碼
冒泡排序的原理:
冒泡排序的原理是:從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數就會從序列的最右邊冒出來。
以從小到大排序為例,第一趟比較后,所有數中最大的那個數就會浮到最右邊;第二趟比較后,所有數中第二大的那個數就會浮到倒數第二個位置……就這樣一趟一趟地比較,最后實現從小到大排序.
主函數:
int main() {?? ?
這里我們創建了一個無規律的數組
?? ?int arr[10] = { 9,8,5,7,3,4,6,2,1,0 };
然后我們把數組的長度計算出來(總字節/單個元素的字節)
?? ?int sz = sizeof(arr) / sizeof(arr[0]);
調用我們自己寫好的"冒泡排序函數"(下面會解釋)
?? ?bubble(arr, sz, sizeof(arr[0]), compare_number);
遍歷交換后的數組
?? ?int i = 0;
?? ?for (i = 0; i < sz; i++) {
?? ??? ?printf("%d ", arr[i]);
?? ?}
}
"冒泡排序函數"
函數的返回值為void,參數是"起始數據地址","總長度","單個數據的字節數","自己定義的比較方法"
void bubble(void* base, int sz , ?int width, int (*cmp)(void* e1, void* e2)) {
?? ?int i = 0;
第一層循環決定交換的趟數
?? ?for (i = 0; i < sz; i++) {
?? ??? ?int j = 0;
定義一個標志量,防止出現排序完成后還繼續交換的情況
?? ??? ?int flag = 1;
每一趟進行冒泡排序
?? ??? ?for (j = 0; j < sz - 1-i; j++) {
這里使用了一個自己寫的比較函數,也就是自己想要的排序方法
?? ??? ??? ?if (cmp((char*)(base)+j * width, (char*)(base)+(j + 1) * width)>0) {
這里是一個交換函數
?? ??? ??? ??? ?Swap((char*)(base)+j * width, (char*)(base)+(j + 1) * width, width);
如果交換了就說明還沒有排序完成,繼續下一趟的排序
?? ??? ??? ??? ?flag = 0;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?if (flag) {
?? ??? ??? ?break;
?? ??? ?}
?? ?}
}
比較函數:
這里就是簡單的大小比較,第一個數大就返回一個大于0的數
int compare_number(void* e1, void* e2) {
?? ?return *(int*)e1 - *(int*)e2;
}
交換函數:
運用的就是把每個元素指針指向的元素進行交換
void Swap(char*e1,char*e2,int width) {
?? ?int i = 0;
?? ?for (i = 0; i < width; i++) {
?? ??? ?char temp = *e1;
?? ??? ?*e1 = *e2;
?? ??? ?*e2 = temp;
?? ??? ?e1++;
?? ??? ?e2++;
?? ?}
}
最終輸出:
完整代碼如下:
#include <stdio.h>
//cmp
int compare_number(void* e1, void* e2) {return *(int*)e1 - *(int*)e2;
}
//Swap
void Swap(char*e1,char*e2,int width) {int i = 0;for (i = 0; i < width; i++) {char temp = *e1;*e1 = *e2;*e2 = temp;e1++;e2++;}
}
//冒泡排序 起始地址 數據長度 數據寬度 比較方法函數
void bubble(void* base, int sz , int width, int (*cmp)(void* e1, void* e2)) {int i = 0;//第一趟for (i = 0; i < sz; i++) {int j = 0;int flag = 1;for (j = 0; j < sz - 1-i; j++) {if (cmp((char*)(base)+j * width, (char*)(base)+(j + 1) * width)>0) {Swap((char*)(base)+j * width, (char*)(base)+(j + 1) * width, width);flag = 0;}}if (flag) {break;}}
}
int main() { int arr[10] = { 9,8,5,7,3,4,6,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble(arr, sz, sizeof(arr[0]), compare_number);int i = 0;for (i = 0; i < sz; i++) {printf("%d ", arr[i]);}
}