對qsort的理解

對qsort的理解

c語言中自帶的快拍qsort, 需要自己寫一個comp的比較函數.
void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
(數組名, 長度, 比較函數)

# include <stdio.h>
# include <stdlib.h>

int a[] = {1, 3, 4, 2, 5};
//從小到大
int comp(const void * p1, const void * p2){
	return *((int*)p1) - *((int *)p2);
}

int main(){

	qsort(a, 5, sizeof(int), comp);

	for(int i = 0; i < 5; ++i){
		printf("%d\t", a[i]);
	}

	return 0;
}

因此做出測試, 以便理解qsort的原理
在comp中加入一下代碼輸出測試結果.

	puts("\n");
	for(int i = 0; i<5; ++i){
		printf("%d\t", a[i]);
	}
	puts("\n\n");
	
	printf("%d -- %d = %d\n", *((int*)p1), *((int *)p2), *((int*)p1) - *((int *)p2));

第一次測試
在這裏插入圖片描述
有結果可知, p2, p1的順序, p2是前面那個數, p1是後面那個數.
如果返回正數, 則證明後面的比前面的大, 這個大的書進入下次的比較, 3 --> 4
返回負數, 則證明前面的數大, 該數繼續進行下次的比較,
5–4 = 1// 第一輪結束, 最大值爲5
第二輪, 從頭開始判斷, 找到一個最大值, 放在倒數第二個位置.
類似於冒泡排序.
簡單說, 返回負數, 則將p1要放在後面, (p1在p2的後面)
return ((int)p1) - *((int *)p2);
即爲從小到大排序.
return ((int)p2) - *((int *)p1);
即爲從小到打排序

若將數組a改爲

int a[] = {5, 3, 4, 2, 1};

在這裏插入圖片描述
可以自己理解下.

之後將寫
int arr1[];
float arr2[];
char arr3[];
char arr4[][]; //每個字符串進行排序
int arr5[][];//每行的數據進行排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章