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

c語言調用庫函數qsort()進行快速排序

系統 2983 0

前言

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

qsort函數原型

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

參數詳解

      base 	: 指向數組中第一個元素(如果只是對數組的一段區域進行排序,那么要使base指向這段區域的第一個元素)
nmemb	: 要排序元素的數量
size    : 每個數組元素的大小,用字節來衡量
compare : 指向比較函數的指針

    

重點

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

測試用例

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

以int數組為測試例子,進行排序

      #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("遞增排序結果:\n");
		}else
		{
			printf("遞減排序結果:\n");
		}
		for(i = 0; i < len; i ++)
		{

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

    

測試結果:



結構體數組排序

大同小異,簡單的貼一道acm題,來說明結構體數組排序的方法吧

excel排序

      題目描述:
    Excel可以對一組紀錄按任意指定列排序。現請你編寫程序實現類似功能。
    對每個測試用例,首先輸出1行“Case i:”,其中 i 是測試用例的編號(從1開始)。隨后在 N 行中輸出按要求排序后的結果,即:當 C=1 時,按學號遞增排序;當 C=2時,按姓名的非遞減字典序排序;當 C=3 
時,按成績的非遞減排序。當若干學生具有相同姓名或者相同成績時,則按他們的學號遞增排序。
輸入:
    測試輸入包含若干測試用例。每個測試用例的第1行包含兩個整數 N (N<=100000) 和 C,其中 N 是紀錄的條數,C 是指定排序的列號。以下有N行,每行包含一條學生紀錄。每條學生紀錄由學號(6位數字,同組測試中沒有重復的學號)、姓名(不超過8位且不包含空格的字符串)、成績(閉區間[0, 100]內的整數)組成,每個項目間用1個空格隔開。當讀到 N=0 時,全部輸入結束,相應的結果不要輸出。
輸出:
    對每個測試用例,首先輸出1行“Case i:”,其中 i 是測試用例的編號(從1開始)。隨后在 N 行中輸出按要求排序后的結果,即:當 C=1 時,按學號遞增排序;當 C=2時,按姓名的非遞減字典序排序;當 C=3 
時,按成績的非遞減排序。當若干學生具有相同姓名或者相同成績時,則按他們的學號遞增排序。
樣例輸入:
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;
		//接收客戶端數據
		for(i = 0; i < n; i ++)
		{
			scanf("%s %s %d", people[i].num, people[i].name, &people[i].grade);
		}

		//快速排序
		switch(k)
		{
			case 1 :
				//按學號排序
				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語言調用庫函數qsort()進行快速排序


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本免费一区二区三区中文 | 日本高清不卡在线观看 | 国产尤物福利视频一区二区 | 中文字幕亚洲精品久久 | 亚洲二区视频 | 手机在线看片国产日韩生活片 | 涩涩视频免费观看 | 日日拍夜夜嗷嗷叫国产 | 欧洲亚洲精品 | 在线久久 | 久久国产高清字幕中文 | 日韩亚洲欧美一区 | 成人国产精品久久久免费 | 天天干夜夜做 | 色婷婷综合和线在线 | 色综合天天综合网国产成人网 | 国产精品福利在线观看入口 | 国产精品久久现线拍久青草 | 天天天做天天天天爱天天想 | 毛片视频播放 | 老子影院午夜久久亚洲 | 国产精品成人麻豆专区 | 中文字幕在线日韩 | 国产在线观看成人免费视频 | 日韩成人免费在线视频 | 欧美大片aaaa一级毛片 | 日本一级毛片a免费播放 | 国产成人不卡亚洲精品91 | 91精品国产高清久久久久 | 亚洲成人一区 | 欧美 激情 在线 | 欧美精品亚洲人成在线观看 | 国产精品亚洲第一区广西莫菁 | 日本中文字幕在线精品 | 精品久久不卡 | 91精品国产露脸在线 | 91青青青青青爽在线 | 99视频久久| 久久久不卡 | 国产成人亚洲综合91精品555 | 国产精品第1页在线播放 |