目錄
1.前言
2.qsort函數的介紹
?3.冒泡法回顧
4.模擬qsort---buble_sort
4.1 buble_sort格式
4.2 主函數,以int類型為例
4.3comp_int函數的功能設計
4.4 swap函數的功能設計
5. 總代碼概覽
1.前言
今天,小鄧兒帶大家用冒泡排序法來模擬一下qsort函數,廢話不都說,咱們開整。
2.qsort函數的介紹
void qsort( void *base,? ? ?//指向的要比較數組的起始地址
? ? ? ? ? ? ? ? ? ? ?size_t num,? ?// 數組大小(元素總數)
? ? ? ? ? ? ? ? ? ? ?size_t width,? ?//數組中一個元素的大小(單位字節)
? ? ? ? ? ? ? ? ? ? ? int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
? ? ? ? ? ? ? ? ? ? ?//比較elem1和elem2的大小,下圖為qsort函數第4個參數的描述?
3.冒泡法回顧???????
一共進行sz-1趟循環,每一趟又依次比較一個數和它后面一個數的大小,最終按從小到大的默認順序進行排列。
4.模擬qsort---buble_sort
4.1 buble_sort格式
void bubble_sort(void* base,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int sz,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int width,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?int(*comp)(const void*, const void*));
具體函數內部情況如下圖
這里的bublue_sort函數,先是會調用comp函數進行兩個數的比較,經過判斷后,再會調用swap函數進行交換。
4.2 主函數,以int類型為例
現在,咱們需要用comp_int來模擬實現compare函數的功能。
4.3comp_int函數的功能設計
int comp_int(const void* e1, const void* e2)
{
?? ?return *(int*)e1 - *(int*)e2;
}
//這里參考下圖compare的功能
Return Value | Description |
< 0 | elem1 less than elem2 |
0 | elem1 equivalent to elem2 |
> 0 | elem1 greater than elem2 |
4.4 swap函數的功能設計
5. 總代碼概覽
#include<stdio.h>
#include<string.h>
int comp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}
void swap(char* e1, char* e2, int width)
{int i = 0;for (i = 0; i < width;i++){int t = *e1;*e1 = *e2;*e2 = t;e1++;e2++;}
}
void bubble_sort(void* base,int sz,int width,int(*comp)(const void*, const void*))//傳過來的形參是指針
{int i, j;for (i = 0; i < sz - 1; i++){int flag = 1;//按從小到大順序排列for (j = 0; j < sz - 1 - i; j++){if (comp((char*)base + j * width, (char*)base + (j + 1) * width )>0)//comp的實參是兩個地址{swap((char*)base + j * width, (char*)base + (j + 1) * width,width);flag = 0;//未按順序排列}}if (flag == 1){break;}}
}
void Print(int arr[], int sz)
{int i = 0;for (i = 0; i < sz - 1; i++){printf("%d ", arr[i]);}printf("\n");return 0;
}
int main()
{int arr[] = { 1,2 ,4 ,3, 6,5,7,9,0 };int sz ;sz = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), comp_int);Print(arr,sz);
}
好了,小鄧兒今天的分享就到這里了,歡迎老鐵們點贊收藏😄😄😄