C語言庫函數中qsort()的用法

qsort是庫函數提供的一種排序方法,我們就簡單1瞭解一下怎麼去用,而不去深究它的庫函數是怎麼寫的

qsort是庫函數中提供的一種能排序任何類型的數據的一種排序方法,思想是quick sort(快速排序),今天我聽鵬哥講指針,剛好引入瞭這一點,我就趁熱打鐵,總結一下該排序的用法

(一)void*  的指針類型是什麼?

void*類型的指針是能接受任何數據類型的地址,但是void*的指針類型是不能進行解引用操作的,也不能進行加減整數的操作,因為void*不知道它會占用多少個字節

#include <stdio.h>
int main()
{
int a=10;
char ch='w';
void* p=&a;
p=&ch;
return 0;
}

(二)void qsort(void*, size_t, size_t, int ( * )(const void * ,  const void *  ))  該怎麼使用該庫函數?

我們先來看看qsort()內部有些什麼參數,參數類型是什麼,該怎麼用。

void qsort(void* base, size_t, size_t, int ( * )(const void * ,  const void *  ))

可以看出共有四個參數

1.void1* base:待排序數組的首地址,可直接輸入待排序數組名,也可使用指針指向該數組

2.size_t num:數組的長度,假如有數組int arr[ ]用sz=sizeof(arr)/sizeof(arr[0])來計算數組的長度

3.size_t width:數組中的元素所占字節,可用sizeof(arr[0])來計算單個元素的字節數

4.

int (*cmp)(const void* e1,const void* e2)
{
return  *(int*)e1 - *(int*)e2;//因為void*類型的指針不能進行加減操作,所以先將e1,e2進行強制類型轉換,轉為int*,然後對其進行解引用
//不同的情形可以根據不同的比較方式來寫入這個函數
//例如,字符串進行比較的時候,可以引用strcmp()這個函數
}

:從這個形式可看出這是一個函數指針類型的參數,意味著將要調用一個函數,而這個函數在庫函數中表示進行排序的方式

這裡簡單解釋一下這個函數指針的意義

int 表示返回的是一個int類型的值

cmp表示函數名,*cmp表示指向這個函數

(const void* e1,const void* e2)這裡·的e1,e2表示將要進行比較的兩個元素,然後將兩個元素的地址傳到函數裡,const表示無法修改指針指向的值

(三)使用qsort()來排序不同類型的數據

1.整型

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[10] = { 3,4,1,2,7,8,9,5,6,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
 
	return 0;
}

2.浮點型

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int cmp_float(const void* e1, const void* e2)
{
	return (int)(*(int*)e1 - *(int*)e2);
    
}
int main()
{
	float arr[6] = { 2.0,2.3,4.5,5.0,8.0,9.0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_float);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%.2f ", arr[i]);
	}
	return 0;
}

3.結構體數據類型(數字,字符串)

下面我創建瞭一個機構體,我先以結構體中年齡排序

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
 
struct stu
{
	char name[20];
	int age;
	char sex[10];
};
int cmp_stu_by_age(const void* e1, const void* e2)//按年齡排序
{
	return ((struct stu*)e1)->age- ((struct stu*)e2)->age;
}
int main()
{
	struct stu s[3] = { {"zhangsan",30,"man"},{"lisi",20,"man"},{"ruhua",18,"woman"}};
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
	int i;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d %s\n", s[i].name, s[i].age, s[i].sex);
	}
	return 0;
}

 然後以姓名排序

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu
{
	char name[20];
	int age;
	char sex[10];
};
int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
 
//int cmp_stu_by_age(const void* e1, const void* e2)
//{
//	return ((struct stu*)e1)->age- ((struct stu*)e2)->age;
//}
int main()
{
	struct stu s[3] = { {"zhangsan",30,"man"},{"lisi",20,"man"},{"ruhua",18,"woman"}};
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
	int i;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d %s\n", s[i].name, s[i].age, s[i].sex);
	}
	return 0;
}

 總結:

今天的qsort就這樣瞭,關鍵在於

int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 – *(int*)e2;
}這一部分的書寫與理解,然後就是孰能生巧,多練習就會知道怎麼用瞭

到此這篇關於C語言庫函數中qsort()的用法的文章就介紹到這瞭,更多相關C語言qsort()內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: