自己網(wǎng)站上做淘寶搜索引擎百度關(guān)鍵詞推廣工具
學(xué)習c語言的過程中少不了的就是排序,例如冒泡排序(不清楚的同學(xué)可以翻找一下之前的文章),
我們這里將冒泡排序作為一個自定義函數(shù)來呈現(xiàn)一下
#include<stdio.h>void bubble_sort(int arr[], int len)
{for (int i = 0; i < len - 1; i++){for (int j = 0; j < len - 1 - i; j++){if (arr[j] > arr[j + 1]){int t = arr[j];arr[j] = arr[j + 1];arr[j + 1] = t;}}}
}void Print(int arr[], int len)
{for (int i = 0; i < len; i++){printf("%d ", arr[i]);}
}int main()
{int arr[] = { 14,32,62,54,23,61,9,67,83,0,34,10,89 };int len = sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, len);Print(arr, len);return 0;
}
這里的自定義函數(shù)bubble_sort()完成的是排序,但是這里要足注意,我們的形參是限制死的int類型數(shù)據(jù),那么如果我們想要排序字符數(shù)組、浮點數(shù)、結(jié)構(gòu)體,這些都無法完成,
那么如果我們想要排序這些東西怎么辦呢,
c語言給的庫函數(shù)中qsort可以完成,
這里值得一提的是,qsort利用的是快速排序(這里不需要了解快速排序原理,與冒泡排序所達到的效果是一致的,只不過過程不同而已),
?
我們來看一下qsort函數(shù)的參數(shù),(第四個參數(shù)為函數(shù)指針,我們要往里面?zhèn)鬟f函數(shù)地址),
下面是對qsort函數(shù)參數(shù)的解讀,
base-指向待排序數(shù)組的第一個元素的指針,
num-base指向數(shù)組中元素的個數(shù),
size-base指向的數(shù)組中一個元素的大小,單位為字節(jié),
compar-
? ? ? ? 這里我們先來想一下,如果改寫一開始寫的冒泡排序來讓它實現(xiàn)字符串的排序、浮點型數(shù)? ? ????????組的排序、甚至是排序結(jié)構(gòu)體數(shù)組,我們應(yīng)該改寫哪一部分,首先,循環(huán)的趟數(shù)不需要改? ????????變,每趟需要比較的次數(shù)也是不變的,那么需要改的就是每次比較,如何比較,對于數(shù)字可? ????????以用大于小于號,但是字符串呢,結(jié)構(gòu)體呢,甚至說內(nèi)部的交換也不能簡單的使用賦值號來 ????????進行,我們所需要改的即下面顯示的部分,
????????那么compar就是指向一個函數(shù),這個函數(shù)是用來比較兩個數(shù)據(jù)的,
????????也就是說,當你想要使用qsort函數(shù)的時候,你只需要傳進去一個你想要如何比較兩個數(shù)據(jù)的? ? ? ? ? 函數(shù),qsort按照你的方法比就可以了,這樣就實現(xiàn)了比較各種數(shù)據(jù),
下面我們來看看如何使用qsort函數(shù),
我們先對照上面的冒泡排序?qū)ζ溥M行一個簡單的改寫,
這是對整型數(shù)組的排序,下面來看看如果是對結(jié)構(gòu)體改如何使用,
注意:void*指針不能解應(yīng)用,那么我們使用的時候需要強制轉(zhuǎn)化一下
這里運用到了箭頭操作符,可以簡單理解為使用指針調(diào)用結(jié)構(gòu)體成員時使用的操作符,不了解的小伙伴可以參考一下之前的文章,
不太清楚strcmp的小伙伴可以看一下,這里我們來簡單介紹一下strcmp,
它的返回類型為int類型,
返回類型正好與我們的qsort函數(shù)第四個變量所需要的返回值一致,所以我們可以簡化返回值部分的內(nèi)容,
這里用strcmp排序名字的時候要注意,名字排序不是按照名字的長短進行排序的,是從第一個字母開始比較其ASCll碼表對應(yīng)的值,當兩者出現(xiàn)不同數(shù)值時,后面
注意使用strcmp時,需要包含頭文件#include<string.h>
到這里,我們的qsort函數(shù)就基本介紹完了。