真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

一、qsort函數(shù)

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

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

二、cmp比較函數(shù)

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

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

三、對一個int類型數(shù)組進行排序

#include#include#include#define SIZE 100
int cmp(const void* a,const void* b)
{
	int* p1=(int*)a;
	int* p2=(int*)b;
	//將a和b強制類型轉(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

四、對一個指針數(shù)組進行排序

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

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

#include#includeint cmp(const void* x,const void* y)
{
	//待排元素是int*類型的,x指向這些元素,
	//所以x的類型是一個指向int*的指針
	//所以x的類型為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;
	}
	//這里有特別注意!??!請看下方?。?! 
}

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

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

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

思路:

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

如圖所示,需要對二維數(shù)組進行兩次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],所以進行++操作! 
	
	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海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧


分享題目:qsort函數(shù)使用樣例:對一維數(shù)組、指針數(shù)組、二維數(shù)組進行排序-創(chuàng)新互聯(lián)
本文來源:http://weahome.cn/article/dpiiep.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部