qsort函數(shù)使用樣例:對(duì)一維數(shù)組、指針數(shù)組、二維數(shù)組進(jìn)行排序-創(chuàng)新互聯(lián)

一、qsort函數(shù)

成都地區(qū)優(yōu)秀IDC服務(wù)器托管提供商(成都創(chuàng)新互聯(lián)公司).為客戶提供專(zhuān)業(yè)的雅安服務(wù)器托管,四川各地服務(wù)器托管,雅安服務(wù)器托管、多線服務(wù)器托管.托管咨詢專(zhuān)線:13518219792

我們知道,包含在函數(shù)庫(kù)stdlib.h中的qsort函數(shù)原型如下:
void qsort( void *base, size_t num, size_t wid, int (*cmp)(const void *e1, const void *e2) );
第一個(gè)參數(shù)base的類(lèi)型是void*,令它指向待排數(shù)組的第一個(gè)元素即可。如果待排數(shù)組是int類(lèi)型數(shù)組a,那么這里輸入a即可。
第二個(gè)參數(shù)num的類(lèi)型是size_t(可理解為unsigned int,輸入一個(gè)int類(lèi)型的參數(shù)可以被隱式類(lèi)型轉(zhuǎn)換為size_t),輸入待排的元素個(gè)數(shù)即可
第三個(gè)參數(shù)wid的類(lèi)型是size_t,記錄待排元素的字節(jié)數(shù)(byte)。比如,如果待排數(shù)組是一個(gè)int類(lèi)型數(shù)組a,那么這里大概輸入4;如果待排數(shù)組是定義為int a[3][5]的二維數(shù)組a,那么數(shù)組的實(shí)際元素應(yīng)該是a[0]、a[1]、a[2],這三個(gè)元素均為類(lèi)型為int[5]的一維數(shù)組,那這三個(gè)元素的長(zhǎng)度應(yīng)該分別為5*4字節(jié);但是,如果待排數(shù)組是定義為int *b[3]的指針數(shù)組b,那么數(shù)組的實(shí)際元素應(yīng)該是b[0]、b[1]、b[2],這三個(gè)元素類(lèi)型均為int*,即指向int的指針,那這三個(gè)元素的長(zhǎng)度又應(yīng)該分別為8(64位系統(tǒng))。wid參數(shù)對(duì)排序至關(guān)重要,因?yàn)閭魅雚sort的參數(shù)是void類(lèi)型指針,它不知道每個(gè)元素的長(zhǎng)度。當(dāng)然,如果不關(guān)注這些細(xì)節(jié),在使用函數(shù)時(shí),該參數(shù)可以直接由sizeof(a[0])這個(gè)式子求得。
第四個(gè)參數(shù)cmp的類(lèi)型是int(*)(const void*,const void*),也即一個(gè)指向函數(shù)的指針,在使用函數(shù)時(shí)直接輸入比較函數(shù)名即可。

二、cmp比較函數(shù)

下面討論比較函數(shù),它的原型為int function_name(const void* a,const void* b);
其中const void*類(lèi)型的形參a、b分別是指向被比較函數(shù)的指針!而且它的類(lèi)型是未定義的,你還需要對(duì)它進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換,不然編譯器會(huì)給你報(bào)出最為友好的error!
同時(shí),為了防止你在排序時(shí)不小心把待排元素的內(nèi)容改了,造成不可預(yù)知的錯(cuò)誤,函數(shù)的設(shè)計(jì)者把參數(shù)定義為了const void*類(lèi)型,也就是一個(gè)指向類(lèi)型未定義常量的指針。
這就是說(shuō),他從根本上防止了你通過(guò)該指針篡改原始數(shù)據(jù)。至于如何使用該函數(shù),下面我們將提供三個(gè)例子來(lái)解釋。

至于該函數(shù)的返回值,是這樣設(shè)計(jì)的,如果你希望第一個(gè)參數(shù)a所指的元素被排在后面,則return 1;如果你希望第一個(gè)參數(shù)a所指的元素被排在后面,那么return -1;如果a、b所指的元素相等,那就return 0 。

三、對(duì)一個(gè)int類(lèi)型數(shù)組進(jìn)行排序

#include#include#include#define SIZE 100
int cmp(const void* a,const void* b)
{
	int* p1=(int*)a;
	int* p2=(int*)b;
	//將a和b強(qiáng)制類(lèi)型轉(zhuǎn)換后分別存入int型指針變量p1和p2 
	if (*p1>*p2)
	{
		return 1;
	}
	else if (*p1<*p2)
	{
		return -1;
	}
	else
	{
		return 0;
	}
}
int num[SIZE];
int main(void)
{
	srand(time(0));
	for (int i=0;i

四、對(duì)一個(gè)指針數(shù)組進(jìn)行排序

1題目信息
cc企業(yè)的研發(fā)團(tuán)隊(duì)目前正在研發(fā) n 款產(chǎn)品。為了平衡成本和性能等因素,研發(fā)團(tuán)隊(duì)對(duì)每款產(chǎn)品計(jì)算其若干個(gè)性能指標(biāo)對(duì)該產(chǎn)品質(zhì)量的影響權(quán)重。由于數(shù)據(jù)未經(jīng)過(guò)整理,研發(fā)團(tuán)隊(duì)無(wú)法直觀的看出對(duì)于某項(xiàng)產(chǎn)品哪些性能指標(biāo)影響權(quán)重較大?,F(xiàn)在研發(fā)團(tuán)隊(duì)把該任務(wù)交給你解決。他們提供的數(shù)據(jù)有:所有產(chǎn)品性能指標(biāo)總數(shù);對(duì)于每個(gè)性能指標(biāo),一個(gè)正整數(shù) id 表示其所屬的產(chǎn)品類(lèi)型,一個(gè)自然數(shù) weight 表示其對(duì)該產(chǎn)品質(zhì)量的影響權(quán)重大小。請(qǐng)你以產(chǎn)品類(lèi)型為第一關(guān)鍵字升序,影響權(quán)重為第二關(guān)鍵字降序?qū)π阅苤笜?biāo)進(jìn)行排序。
2輸入格式
共輸入 N+1 行。
第一行一個(gè)正整數(shù) N ,表示所有性能指標(biāo)總數(shù)。
第 i+1(1≤i≤N) 行,一個(gè)正整數(shù) id 和一個(gè)自然數(shù) weight ,中間用空格隔開(kāi)。(意義如題目所示)
3輸出格式
共輸出 N 行,第 i 行輸出按照上述規(guī)則排序后的第 i 個(gè)指標(biāo)的排名(從 1 開(kāi)始)、一個(gè)正整數(shù) id 和一個(gè)自然數(shù) weight ,行內(nèi)數(shù)與數(shù)之間用空格隔開(kāi)。注:若性能指標(biāo)的 id 和 weight 完全相同,則排名也相同。

思路:用一個(gè)二重int類(lèi)型指針來(lái)存輸入的所有主要數(shù)據(jù)(當(dāng)然要malloc兩下),對(duì)這個(gè)數(shù)組進(jìn)行排序即可

#include#includeint cmp(const void* x,const void* y)
{
	//待排元素是int*類(lèi)型的,x指向這些元素,
	//所以x的類(lèi)型是一個(gè)指向int*的指針
	//所以x的類(lèi)型為int** 
	int **a=(int **)x;
	
	int **b=(int **)y;
	
	if ((*a)[0]>(*b)[0])
	{
		return 1;
	}
	else if((*a)[0]<(*b)[0])
	{
		return -1;
	}
	else
	{
		if ((*a)[1]<(*b)[1])
		{
			return 1;
		}
		else if((*a)[1]>(*b)[1])
		{
			return -1;
		}
		else 
			return 0;
	}
	//這里有特別注意?。?!請(qǐng)看下方!?。?
}

int main(void)
{
	int n;
	//用于儲(chǔ)存數(shù)據(jù)組數(shù) 
	int **date;
	//用于儲(chǔ)存所有數(shù)據(jù) 
	scanf("%d",&n);
	//讀入數(shù)據(jù)組數(shù)到變量n 
	date=(int**)malloc(n*sizeof(int *));
	//為date分配空間,則date[n]是一個(gè)指針數(shù)組 
	for (int i=0;i=0;k--)
		{
			if (*(*(date+k)+0)!=*(*(date+k+1)+0)||*(*(date+k)+1)!=*(*(date+k+1)+1))
			{
				break;
			}
			else
			{
				num=k;
			}
		}
		//這個(gè)循環(huán)的目的是找到那些相等的元素,從而對(duì)它的序號(hào)進(jìn)行處理 
		
		printf("%d %d %d\n",num+1,*(*(date+i)+0),*(*(date+i)+1));
	}
	
	return 0;
}

特別注意:在cmp比較函數(shù)中,可以看到if和else語(yǔ)句中我寫(xiě)的是(*a)[1]而非*a[1]。這是為什么呢?
這是由于,在c語(yǔ)言中引號(hào)[]的優(yōu)先級(jí)比解引用符*高,如果按照后者方式編程,則等價(jià)于*(*(a+1))和a[0][1]
而按照標(biāo)準(zhǔn)的寫(xiě)法,則等價(jià)于*((*a)+1)和a[0][1],顯然,*a[1]是不符合我們的期望的

五、對(duì)一個(gè)二維數(shù)組進(jìn)行排序
1題目描述
愛(ài)吃豬腳的豬腳熱衷解謎游戲,他發(fā)現(xiàn)解謎游戲里面有一些數(shù)字,他覺(jué)得將這些數(shù)字排好序可能得到一些線索,想拜托你幫忙排好序。
解謎任務(wù)卡上寫(xiě)著:請(qǐng)你將數(shù)據(jù)從小到大排序,并按照順序編號(hào),相同的數(shù)據(jù)具有相同的編號(hào)。即如果有 n 個(gè)相同的數(shù)據(jù),它們的編號(hào)為 p ,則下一個(gè)編號(hào)為 n+p 。
輸入
2一行若干個(gè)實(shí)數(shù),每個(gè)實(shí)數(shù)之間使用空格隔開(kāi),保證最后一個(gè)實(shí)數(shù)之后沒(méi)有空格和換行符。
實(shí)數(shù)可能為小數(shù)形式或科學(xué)計(jì)數(shù)法形式,最多保留 6 位小數(shù)。
輸出
3共 n+1 行輸出。
第一行為數(shù)據(jù)數(shù)量 n 。
接下來(lái) n 行,按照輸入數(shù)據(jù)的順序輸出數(shù)值,格式為 [編號(hào)]: [數(shù)值] ,具體見(jiàn)題目描述定義,注意冒號(hào)后有一個(gè)空格。

思路:

創(chuàng)建ch字符串?dāng)?shù)組(類(lèi)型為char[500005][15])用以存儲(chǔ)輸入信息,創(chuàng)建data二維double型數(shù)組(類(lèi)型為double[500005][3])用以排序。其中data[i][0]用以存儲(chǔ)對(duì)應(yīng)浮點(diǎn)數(shù)。

如圖所示,需要對(duì)二維數(shù)組進(jìn)行兩次qsort排序

#include#includechar ch[500005][15];

double data[500005][3];

int cmp1(const void* a,const void* b)
{
	double* p1=(double*)a;
	
	double* p2=(double*)b;
	
	if (*p1>*p2)
	{
		return 1;
	}
	else if (*p1<*p2)
	{
		return -1;
	}
	else
	{
		return 0;
	}
}

int cmp2(const void* a,const void* b)
{
	double* p1=(double*)a;
	
	double* p2=(double*)b;
	
	p1++;
	
	p2++;
	//為了讓指針指向data[i][1],所以進(jìn)行++操作! 
	
	if (*p1>*p2)
	{
		return 1;
	}
	else if (*p1<*p2)
	{
		return -1;
	}
	else
	{
		return 0;
	}
}





int main (void)
{
	int max=0;
	
	while (scanf("%s",&ch[max])!=EOF)
	{
		data[max][0]=atof(ch[max]);
		
		data[max][1]=max;
		
		max++;
	}
	
	qsort(data,max,sizeof(data[0]),cmp1);
	
	for (int i=0;i0;k--)
			{
				if (data[k-1][0]!=data[k][0])
				{
					data[i][2]=(double)(k+0.1);
					
					break;
				}
			}
		}
	}
	
	qsort(data,max,sizeof(data[0]),cmp2);
	
	for (int i=0;i

小記:這道題用結(jié)構(gòu)體為最優(yōu)解

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

文章名稱(chēng):qsort函數(shù)使用樣例:對(duì)一維數(shù)組、指針數(shù)組、二維數(shù)組進(jìn)行排序-創(chuàng)新互聯(lián)
標(biāo)題來(lái)源:http://muchs.cn/article48/dpiiep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、App設(shè)計(jì)定制開(kāi)發(fā)、動(dòng)態(tài)網(wǎng)站域名注冊(cè)、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司