亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統(tǒng) 3382 0

前言

各種排序方法中,例如冒泡、插入,快排等我最喜歡用快速排序,特別欣賞快排的分治思想,調(diào)用系統(tǒng)的qsort函數(shù)前希望大家也能了解一下快速排序的原理,參考鏈接見: 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ù)組中第一個元素(如果只是對數(shù)組的一段區(qū)域進(jìn)行排序,那么要使base指向這段區(qū)域的第一個元素)
nmemb	: 要排序元素的數(shù)量
size    : 每個數(shù)組元素的大小,用字節(jié)來衡量
compare : 指向比較函數(shù)的指針

    

重點

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

測試用例

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

以int數(shù)組為測試?yán)?,進(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;
} 

    

測試結(jié)果:



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

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

excel排序

      題目描述:
    Excel可以對一組紀(jì)錄按任意指定列排序?,F(xiàn)請你編寫程序?qū)崿F(xiàn)類似功能。
    對每個測試用例,首先輸出1行“Case i:”,其中 i 是測試用例的編號(從1開始)。隨后在 N 行中輸出按要求排序后的結(jié)果,即:當(dāng) C=1 時,按學(xué)號遞增排序;當(dāng) C=2時,按姓名的非遞減字典序排序;當(dāng) C=3 
時,按成績的非遞減排序。當(dāng)若干學(xué)生具有相同姓名或者相同成績時,則按他們的學(xué)號遞增排序。
輸入:
    測試輸入包含若干測試用例。每個測試用例的第1行包含兩個整數(shù) N (N<=100000) 和 C,其中 N 是紀(jì)錄的條數(shù),C 是指定排序的列號。以下有N行,每行包含一條學(xué)生紀(jì)錄。每條學(xué)生紀(jì)錄由學(xué)號(6位數(shù)字,同組測試中沒有重復(fù)的學(xué)號)、姓名(不超過8位且不包含空格的字符串)、成績(閉區(qū)間[0, 100]內(nèi)的整數(shù))組成,每個項目間用1個空格隔開。當(dāng)讀到 N=0 時,全部輸入結(jié)束,相應(yīng)的結(jié)果不要輸出。
輸出:
    對每個測試用例,首先輸出1行“Case i:”,其中 i 是測試用例的編號(從1開始)。隨后在 N 行中輸出按要求排序后的結(jié)果,即:當(dāng) C=1 時,按學(xué)號遞增排序;當(dāng) C=2時,按姓名的非遞減字典序排序;當(dāng) C=3 
時,按成績的非遞減排序。當(dāng)若干學(xué)生具有相同姓名或者相同成績時,則按他們的學(xué)號遞增排序。
樣例輸入:
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;
		//接收客戶端數(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é)號排序
				qsort(people, n, sizeof(people[0]), compareByNum);
				break;
			case 2 :
				//按姓名排序
				qsort(people, n, sizeof(people[0]), compareByName);
				break;
			case 3 :
				//按成績排序
				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語言調(diào)用庫函數(shù)qsort()進(jìn)行快速排序


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。。?/p>

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 狠狠色狠色综合曰曰 | 天天操天天艹 | 天天干天天操天天做 | 国内精品自在自线在免费 | 国产未成女年一区二区 | 久草视频资源在线 | 一区二区三区四区产品乱码伦 | 国产亚洲美女精品久久久久狼 | 中文一级国产特级毛片视频 | 国产麻豆va精品视频 | 99久久一区 | 欧美一级视频在线观看欧美 | 国产午夜精品尤物福利视频 | 特黄特色大片免费播放器999 | 国产精品柳州莫菁身材四 | 香蕉人人超 | 国产99久久九九精品免费 | 免费观看国产精品 | 肉漫天堂 | 99热这就是里面只有精品 | 咪咪爱在线视频 | 黄色毛片视频 | 这里只有精品免费视频 | 欧美草逼视频 | 亚洲欧美国产精品专区久久 | 性成人动作片在线看 | 福利视频欧美一区二区三区 | 亚洲欧美日韩国产综合久 | 韩国午夜影院 | 国产精品国产三级国产a | 真人毛片免费拍拍拍aa视频 | 国产日产欧美一区二区三区 | 四虎+网站+影院+网站 | 站长推荐国产精品视频 | 伊人一伊人色综合网 | 成人欧美一区二区三区在线观看 | 免费视频一区二区三区四区 | 久久精品国产亚洲精品2020 | 日本黄黄 | 香蕉青草久久成人网 | 波多野结衣一区二区三区四区 |