? 我們在使用冒泡排序法做題的時候,經常會遇到運算次數過多程序超時的情況,而且冒泡排序法只能對整形數組進行排序。
創(chuàng)新互聯長期為千余家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態(tài)環(huán)境。為青田企業(yè)提供專業(yè)的成都做網站、網站設計,青田網站改版等技術服務。擁有10余年豐富建站經驗和眾多成功案例,為您定制開發(fā)。? 為了解決這些問題!就使用qsort函數吧!
目錄
一、qsort函數使用方法
二、qsort函數使用示例
1.數組排序
2.字符數組排序
3.字符串排序
4.結構體排序
??1.?首先qsort函數是庫函數,使用前應包含對應頭文件#include
? 2.qsort函數的函數聲明
int qsort(void*? base,size_t? num,size_t? width,int(*compare)(const?*void e1)(const *void e2))
因為本篇文章是?c語言初階文章,所以看不懂沒關系,我們直接來看使用方法
? 3.qsort函數使用
qsort(需要被排序的數組,數組元素個數,每個元素大小,排序函數名)
需要被排序的數組,數組元素個數,每個元素大小不需要解釋
那么排序函數是什么意思呢?
排序函數就是由qsort函數的使用者自己定義的兩個元素排大小準則,我們來看一個簡單的示例
int compare(const void* e1, const void* e2)
{
int* p1 = e1;
int* p2 = e2;
if (*p1 >*p2)
{
return 1;
}
else if (*p1 == *p2)
{
return 0;
}
else if (*p1< *p2)
{
return -1;
}
}
int compare(const void* e1, const void* e)首先看排序函數的參數 排序函數的參數類型?一定是const?void*
const—可以使在函數運行的過程中?原數組的值不被改變
void—是為了提升函數普適性,強制規(guī)定函數參數為void*
因為一會要返回參數?所以函數返回類型規(guī)定int
int* p1 = e1;
int* p2 = e2;void*指針不能直接使用,所以創(chuàng)建兩個整形指針儲存原指針(被排序元素什么類型就用什么指針)
?? ?if (*p1 >*p2)
?{
??? ?return 1;
?}
?else if (*p1 == *p2)
?{
??? ?return 0;
?}
?else if (*p1< *p2)
?{
??? ?return -1;
?}這部分則為使用者自己定義的比較大小準則,如果該情況為大于則返回一個>0的值,如果小于返回一個<0的值,如果等于,則返回0
然后qsort函數會自行對數組按照規(guī)定準則進行排序。
二、qsort函數使用示例 ? ? ? 1.數組排序#include#includeint compare(const void* e1, const void* e2)
{
int* p1 = e1;
int* p2 = e2;
if (*p1 >*p2)
{
return 1;
}
else if (*p1 == *p2)
{
return 0;
}
else if (*p1< *p2)
{
return -1;
}
}
int main()
{
int arr[10] = { 1,3,5,7,9,2,4,6,8,10 };
qsort(arr, 10, 4, compare);
for (int i = 0; i<= 9; i++)
{
printf("%d ", arr[i]);
}
}
2.字符數組排序#include#includeint compare(const void* e1, const void* e2)
{
char* p1 = e1;
char* p2 = e2;
if (*p1 >*p2)
{
return 1;
}
else if (*p1 == *p2)
{
return 0;
}
else if (*p1< *p2)
{
return -1;
}
}
int main()
{
char arr[10] = { 'a','c','b','d','h','g','t','n' ,'w'};
qsort(arr, 9, 1, compare);
printf("%s", arr);
}
3.字符串排序#include#includeint compare(const void* e1, const void* e2)//規(guī)定按首字母順序排序
{
char* p1 = e1;
char* p2 = e2;
if (*p1 >*p2)
{
return 1;
}
else if (*p1 == *p2)
{
return 0;
}
else if (*p1< *p2)
{
return -1;
}
}
int main()
{
char arr1[5] = "abc";
char arr2[5] = "bcd";
char arr3[5] = "cdf";
char arr4[5] = "gnm";
char* arr[4] = { arr1,arr2,arr3,arr4 };//定義了一個指針數組來存放四個字符串數組的指針(數組名為數組第一個元素地址)
qsort(arr, 4, 4, compare);//每個元素均為指針,指針大小為4字節(jié)
printf("%s %s %s %s", arr1,arr2,arr3,arr4);
}
4.結構體排序#include#includestruct stu
{
int grade;
char name[20];
char sex[10];
};
int compare(const void* e1, const void* e2)//規(guī)定按成績排序
{
struct stu* p1 = e1;
struct stu* p2 = e2;
if (p1->grade >p2->grade)
{
return 1;
}
else if (p1->grade==p2->grade)
{
return 0;
}
else if (p1->grade< p2->grade)
{
return -1;
}
}
int main()
{
struct stu a = { 90,"zhangsan","man" };
struct stu b = { 80,"lisi","man" };
struct stu c = { 70,"wangwu","man" };
struct stu arr[3] = { a,b,c };
qsort(arr, 3, sizeof(a), compare);
for (int i = 0; i<= 2; i++)
printf("%d %s %s\n", arr[i].grade, arr[i].name, arr[i].sex);
}
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧