日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

c語(yǔ)言調(diào)用庫(kù)函數(shù)qsort()進(jìn)行快速排序

系統(tǒng) 3341 0

前言

各種排序方法中,例如冒泡、插入,快排等我最喜歡用快速排序,特別欣賞快排的分治思想,調(diào)用系統(tǒng)的qsort函數(shù)前希望大家也能了解一下快速排序的原理,參考鏈接見(jiàn): http://blog.csdn.net/zinss26914/article/details/8043168

qsort函數(shù)原型

      void qsort(void *base, size_t nmemb, size_t size, int(*compare) (const void *, const void *));
    
函數(shù)原型在<stdlib.h>中找到

參數(shù)詳解

      base 	: 指向數(shù)組中第一個(gè)元素(如果只是對(duì)數(shù)組的一段區(qū)域進(jìn)行排序,那么要使base指向這段區(qū)域的第一個(gè)元素)
nmemb	: 要排序元素的數(shù)量
size    : 每個(gè)數(shù)組元素的大小,用字節(jié)來(lái)衡量
compare : 指向比較函數(shù)的指針

    

重點(diǎn)

數(shù)組的元素可能是任何類(lèi)型的,甚至可能是結(jié)構(gòu)體或聯(lián)合,所以必須告訴函數(shù)qsort如何確定兩個(gè)數(shù)組元素哪一個(gè)“更小”。通過(guò)編寫(xiě) 比較函數(shù) 可以為qsort提供這些信息。當(dāng)給定兩個(gè)指向數(shù)組元素的指針p和q時(shí),比較函數(shù)必須返回一個(gè)整數(shù),如果*p小于*q,那么返回的數(shù)為負(fù)數(shù);如果*p等于*q,那么返回0.如果*p大于*q,返回正數(shù).按照這種結(jié)果返回,qsort對(duì)數(shù)組默認(rèn)是升序排序.如果想降序,只需要將上述結(jié)果返回值*-1即可

測(cè)試用例

int&&char數(shù)組排序(c代碼)

以int數(shù)組為測(cè)試?yán)樱M(jìn)行排序

      #include <stdio.h>
#include <stdlib.h>

int compi(const void *a, const void *b)
{
	const int *p = a;
	const int *q = b;

	return *p - *q;
}

int compd(const void *a, const void *b)
{
	const int *p = a;
	const int *q = b;

	return (*p - *q) * (-1);
}


int main()
{
	int a[1000];
	int i, len, type;

	while(scanf("%d %d", &len, &type) != EOF)
	{
		for(i = 0; i < len; i ++)
		{
			scanf("%d", &a[i]);
		}

		switch(type)
		{
			case 1 :
				//遞增排序
				qsort(a, len, sizeof(a[0]), compi);
				break;
			case 2 :
				//遞減排序
				qsort(a, len, sizeof(a[0]), compd);
				break;
		}

		if(type == 1)
		{
			printf("遞增排序結(jié)果:\n");
		}else
		{
			printf("遞減排序結(jié)果:\n");
		}
		for(i = 0; i < len; i ++)
		{

			printf("%d ", a[i]);
		}
		printf("\n");
	}
	return 0;
} 

    

測(cè)試結(jié)果:



結(jié)構(gòu)體數(shù)組排序

大同小異,簡(jiǎn)單的貼一道acm題,來(lái)說(shuō)明結(jié)構(gòu)體數(shù)組排序的方法吧

excel排序

      題目描述:
    Excel可以對(duì)一組紀(jì)錄按任意指定列排序。現(xiàn)請(qǐng)你編寫(xiě)程序?qū)崿F(xiàn)類(lèi)似功能。
    對(duì)每個(gè)測(cè)試用例,首先輸出1行“Case i:”,其中 i 是測(cè)試用例的編號(hào)(從1開(kāi)始)。隨后在 N 行中輸出按要求排序后的結(jié)果,即:當(dāng) C=1 時(shí),按學(xué)號(hào)遞增排序;當(dāng) C=2時(shí),按姓名的非遞減字典序排序;當(dāng) C=3 
時(shí),按成績(jī)的非遞減排序。當(dāng)若干學(xué)生具有相同姓名或者相同成績(jī)時(shí),則按他們的學(xué)號(hào)遞增排序。
輸入:
    測(cè)試輸入包含若干測(cè)試用例。每個(gè)測(cè)試用例的第1行包含兩個(gè)整數(shù) N (N<=100000) 和 C,其中 N 是紀(jì)錄的條數(shù),C 是指定排序的列號(hào)。以下有N行,每行包含一條學(xué)生紀(jì)錄。每條學(xué)生紀(jì)錄由學(xué)號(hào)(6位數(shù)字,同組測(cè)試中沒(méi)有重復(fù)的學(xué)號(hào))、姓名(不超過(guò)8位且不包含空格的字符串)、成績(jī)(閉區(qū)間[0, 100]內(nèi)的整數(shù))組成,每個(gè)項(xiàng)目間用1個(gè)空格隔開(kāi)。當(dāng)讀到 N=0 時(shí),全部輸入結(jié)束,相應(yīng)的結(jié)果不要輸出。
輸出:
    對(duì)每個(gè)測(cè)試用例,首先輸出1行“Case i:”,其中 i 是測(cè)試用例的編號(hào)(從1開(kāi)始)。隨后在 N 行中輸出按要求排序后的結(jié)果,即:當(dāng) C=1 時(shí),按學(xué)號(hào)遞增排序;當(dāng) C=2時(shí),按姓名的非遞減字典序排序;當(dāng) C=3 
時(shí),按成績(jī)的非遞減排序。當(dāng)若干學(xué)生具有相同姓名或者相同成績(jī)時(shí),則按他們的學(xué)號(hào)遞增排序。
樣例輸入:
3 1
000007 James 85
000010 Amy 90
000001 Zoe 60
4 2
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 98
4 3
000007 James 85
000010 Amy 90
000001 Zoe 60
000002 James 90
0 0
樣例輸出:
Case 1:
000001 Zoe 60
000007 James 85
000010 Amy 90
Case 2:
000010 Amy 90
000002 James 98
000007 James 85
000001 Zoe 60
Case 3:
000001 Zoe 60
000007 James 85
000002 James 90
000010 Amy 90
    

ac代碼

      #include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct student
{
	char num[7];
	char name[9];
	int grade;
};

int compareByNum(const void *a, const void *b);
int compareByName(const void *a, const void *b);
int compareByGrade(const void *a, const void *b);

int main()
{
	int i, n, k;
	struct student people[100001];
	static int size = 1;

	while(scanf("%d %d", &n, &k) != EOF)
	{
		if(n == 0)
			break;
		//接收客戶(hù)端數(shù)據(jù)
		for(i = 0; i < n; i ++)
		{
			scanf("%s %s %d", people[i].num, people[i].name, &people[i].grade);
		}

		//快速排序
		switch(k)
		{
			case 1 :
				//按學(xué)號(hào)排序
				qsort(people, n, sizeof(people[0]), compareByNum);
				break;
			case 2 :
				//按姓名排序
				qsort(people, n, sizeof(people[0]), compareByName);
				break;
			case 3 :
				//按成績(jī)排序
				qsort(people, n, sizeof(people[0]), compareByGrade);
				break;
		}

		//打印輸出
		printf("Case %d:\n", size ++);
		for(i = 0; i < n; i ++)
		{
			printf("%s %s %d\n", people[i].num, people[i].name, people[i].grade);
		}
	}

	return 0;
}

int compareByNum(const void *a, const void *b)
{
	const struct student *p = a;
	const struct student *q = b;

	return strcmp(p->num, q->num);	
}

int compareByName(const void *a, const void *b)
{
	const struct student *p = a;
	const struct student *q = b;

	if(strcmp(p->name, q->name) > 0)
	{
		return 1;
	}else if(strcmp(p->name, q->name) == 0 && strcmp(p->num, q->num) > 0)
	{
		return 1;
	}else
	{
		return -1;
	}
}

int compareByGrade(const void *a, const void *b)
{
	const struct student *p = a;
	const struct student *q = b;

	if(p->grade > q->grade)
	{
		return 1;
	}else if(p->grade == q->grade && strcmp(p->num, q->num) > 0)
	{
		return 1;
	}else
	{
		return -1;
	}
}

    



c語(yǔ)言調(diào)用庫(kù)函數(shù)qsort()進(jìn)行快速排序


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 裕民县| 荥阳市| 鄂尔多斯市| 海兴县| 阿鲁科尔沁旗| 伊春市| 大关县| 从江县| 安国市| 南部县| 乌拉特中旗| 庆安县| 西华县| 称多县| 淳化县| 永昌县| 孟连| 洛浦县| 深水埗区| 开化县| 澎湖县| 揭东县| 盐山县| 庆安县| 安龙县| 喀喇沁旗| 阳城县| 桂东县| 施甸县| 和田县| 阿合奇县| 扶绥县| 湟中县| 和田市| 辉南县| 互助| 山西省| 清远市| 新乡市| 织金县| 太保市|