1. 程式人生 > >qsort函式解析

qsort函式解析

qsort函式是一種回撥函式,是基於快速排序的演算法,可以實現排序。 

這裡先看一下qsort函式的引數

                                void qsort(void* base, size_t num, size_t size,int(*compar)(const void*, const void*));

第一個引數是傳要排列的陣列;

第二個引數是陣列中元素的個數;

第三個是陣列中每個元素的長度;

最後一個引數是一個函式指標,指向一個比較函式。

說明:函式名和&函式名都是指向函式的地址,所以在qsort函式中,最後一個引數可以是比較函式名,也可以是&函式名。

           在程式碼中我使用的是&函式名。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

//CmpInt 是 qsort 的比較函式
//呼叫時機不是由程式設計師自己決定的
//而是由 qsort 內部來決定的
//像這種風格的函式就叫“回撥函式”
int CmpInt(void* p1, void* p2)
{
	int* a = (int*)p1;
	int* b = (int*)p2;
	//如果*a < *b,函式返回真,否則返回假。
	//p1和p2,如果希望p2指向的元素在p1的前面,返回真。
	return *a < *b;
}


int main()
{
	int arr[] = { 9, 5, 2, 7 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//qsort是基於快速排序的演算法
	//void qsort(void* base, size_t num, size_t size,int(*compar)(const void*, const void*));
	qsort(arr, sz, sizeof(arr[0]), &CmpInt);
	for (int i = 0; i < sz; i++)
	{
		printf("%d\n", arr[i]);
	}
	system("pause");
	return 0;
}

這裡實現的是一個升序,如果想要實現降序,只需把比較函式中的return 改為*a > *b即可。