最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中的結(jié)構(gòu)體快排算法

 更新時間:2022年11月11日 12:11:52   作者:王睿丶  
這篇文章主要介紹了C語言中的結(jié)構(gòu)體快排算法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

C語言結(jié)構(gòu)體快排算法

代碼:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Stu{
	char name[100];	//名字 
	char xue[100];	//學(xué)號 
	int c;			//成績 
}stu[10010];
int comp(const void* a,const void* b)
{
	struct Stu *aa = (struct Stu *)a;
	struct Stu *bb = (struct Stu *)b;
	return ((aa->c)-(bb->c));		//aa->c為結(jié)構(gòu)體的成員,bb->c也為結(jié)構(gòu)體的成員 
}
int main()
{
	int n;
	int i,j;
	scanf("%d",&n);
	getchar();
	for(i=0;i<n;i++)
	{
		scanf("%s%s%d",&stu[i].name,&stu[i].xue,&stu[i].c);
	}
	printf("\n");
	qsort(stu,n,sizeof(stu[0]),comp);	//參數(shù)1:結(jié)構(gòu)體數(shù)組名,個數(shù),首地址的字符數(shù),自定義比較函數(shù)名 
	for(i=0;i<n;i++)
	printf("%s %s %d\n",stu[i].name,stu[i].xue,stu[i].c);
	return 0;
}

基于結(jié)構(gòu)體數(shù)組的快速排序

用普通的數(shù)組快速排序,改造成任意數(shù)據(jù)的排序,比如結(jié)構(gòu)體數(shù)組、鏈表、棧的排序等。只需要在排序中調(diào)用自己的compare函數(shù),在其中把想要排序的值做一個比較即可,代碼如下:

#include <stdio.h>
#include <strings.h>

typedef int (*Z_COMPARE)(void* obj1, int obj1size, void* obj2, int obj2size);
typedef struct
{
	char name[20];
	char brief_name[20];
	char desc[20];
}ROOM_INFO;

int room_info_cmp(void* obj1, int obj1size, void* obj2, int obj2size)
{
	ROOM_INFO* item1 = (ROOM_INFO*)obj1;
	ROOM_INFO* item2 = (ROOM_INFO*)obj2;
	
	if(atoi(item1->brief_name) < atoi(item2->brief_name))
	{
		return 1;
	}
	else if(atoi(item1->brief_name) > atoi(item2->brief_name))
	{
		return 0;
	}
	return -1;
}

int quicksort(ROOM_INFO* room_info, int left, int right, Z_COMPARE cmp)
{
	ROOM_INFO tmp = {0};
	ROOM_INFO f = {0};
	int rtemp,ltemp;
	
	ltemp = left;
	rtemp = right;
	if(ltemp >= rtemp)
	{
		return 0;//排序結(jié)束 
	}
	memcpy(&f, &room_info[left], sizeof(ROOM_INFO));//保存基準(zhǔn)值
	
	while(ltemp < rtemp)
	{
		while(cmp(&room_info[rtemp], sizeof(ROOM_INFO), &f, sizeof(ROOM_INFO)) == 0 && ltemp < rtemp)
		{
			--rtemp;
		}
		if(ltemp != rtemp)
		{
			memcpy(&room_info[ltemp], &room_info[rtemp], sizeof(ROOM_INFO));
			ltemp++;
		}
		while(cmp(&room_info[ltemp], sizeof(ROOM_INFO), &f, sizeof(ROOM_INFO)) == 1 && ltemp < rtemp)
		{
			++ltemp;
		}
		if(ltemp != rtemp)
		{
			memcpy(&room_info[rtemp], &room_info[ltemp], sizeof(ROOM_INFO));
			rtemp--;
		}
	}
	memcpy(&room_info[ltemp], &f, sizeof(ROOM_INFO));

	if(left < rtemp)
	{
		quicksort(room_info, left, ltemp-1, cmp);
	}
	if(ltemp < right)
	{
		quicksort(room_info, rtemp+1, right, cmp);
	}
	return 0;
}

int main()
{
	ROOM_INFO room_info[10] = {0};
	int i = 0;
	srand(time(NULL));
	for(i = 0; i < 10; i++)
	{
		snprintf(room_info[i].brief_name, sizeof(room_info[i].brief_name), "%d", rand()%100);
	}
	
	for(i = 0; i < 10; i++)
	{
		printf("111111,room_info[%d].brief_name=%s\n",i, room_info[i].brief_name);
	}
	printf("\n\n"); 
	quicksort(room_info, 0, 9, room_info_cmp);
	for(i = 0; i < 10; i++)
	{
		printf("222222,room_info[%d].brief_name=%s\n",i, room_info[i].brief_name);
	}
	return 0;
}

運(yùn)行結(jié)果如下:

如果是鏈表的排序,只需要把quicksort函數(shù)的第一個參數(shù)換成鏈表的指針,然后在排序中換成相應(yīng)獲取鏈表里的數(shù)據(jù)即可。

另外,C語言提供一個庫函數(shù),已經(jīng)封裝好了快速排序的算法:

void qsort(
    void *base,
    size_t nmemb,
    size_t size,
    int (*compar)(const void *, const void *)
    );

具體的信息如下:Copy from baidu

  • 參數(shù)base - base指向數(shù)組的起始地址,通常該位置傳入的是一個數(shù)組名
  • 參數(shù)nmemb - nmemb表示該數(shù)組的元素個數(shù)
  • 參數(shù)size - size表示該數(shù)組中每個元素的大小(字節(jié)數(shù))
  • 參數(shù)(*compar)(const void *, const void *) - 此為指向比較函數(shù)的函數(shù)指針,決定了排序的順序。

函數(shù)返回值:無

注意:如果兩個元素的值是相同的,那么它們的前后順序是不確定的。也就是說qsort()是一個不穩(wěn)定的排序算法。

compar參數(shù)

  • compar參數(shù)指向一個比較兩個元素的函數(shù)。比較函數(shù)的原型應(yīng)該像下面這樣。
  • 注意兩個形參必須是const void *型,同時在調(diào)用compar 函數(shù)(compar實(shí)質(zhì)為函數(shù)指針,這里稱它所指向的函數(shù)也為compar)時,
  • 傳入的實(shí)參也必須轉(zhuǎn)換成const void *型。在compar函數(shù)內(nèi)部會將const void *型轉(zhuǎn)換成實(shí)際類型,見下文。

int compar(const void *p1, const void *p2);

  • 如果compar返回值小于0(< 0),那么p1所指向元素會被排在p2所指向元素的前面
  • 如果compar返回值等于0(= 0),那么p1所指向元素與p2所指向元素的順序不確定
  • 如果compar返回值大于0(> 0),那么p1所指向元素會被排在p2所指向元素的后面

因此,如果想讓qsort()進(jìn)行從小到大(升序)排序,那么一個上面的compar函數(shù)可以寫成這樣:

int room_info_cmp(void* obj1, void* obj2)
{
	ROOM_INFO* item1 = (ROOM_INFO*)obj1;
	ROOM_INFO* item2 = (ROOM_INFO*)obj2;
	
	if(atoi(item1->brief_name) < atoi(item2->brief_name))
	{
		return -1;
	}
	else if(atoi(item1->brief_name) > atoi(item2->brief_name))
	{
		return 1;
	}
	return 0;
}

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++常用語句簡介

    C++常用語句簡介

    這篇文章主要介紹了C++常用語句簡介,文章將要介紹的常用語句有聲明變量、賦值語句、cin、cout語句、庫函數(shù)、自定義函數(shù),需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11
  • c語言獲取用戶輸入字符串是scanf和gets的區(qū)別詳解

    c語言獲取用戶輸入字符串是scanf和gets的區(qū)別詳解

    今天小編就為大家分享一篇c語言獲取用戶輸入字符串是scanf和gets的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • C++設(shè)計模式中控制反轉(zhuǎn)與依賴注入淺析

    C++設(shè)計模式中控制反轉(zhuǎn)與依賴注入淺析

    這篇文章主要介紹了C++設(shè)計模式中控制反轉(zhuǎn)與依賴注入,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • C語言全面細(xì)致精講操作符的使用

    C語言全面細(xì)致精講操作符的使用

    C?語言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。接下了讓我們詳細(xì)了解掌握它
    2022-05-05
  • Vc++ 控件List Control用法總結(jié)

    Vc++ 控件List Control用法總結(jié)

    這篇文章主要介紹了Vc++ 控件List Control用法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2015-06-06
  • C++實(shí)現(xiàn)簡單通訊錄系統(tǒng)

    C++實(shí)現(xiàn)簡單通訊錄系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單通訊錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 基于curses庫實(shí)現(xiàn)彈球游戲

    基于curses庫實(shí)現(xiàn)彈球游戲

    這篇文章主要為大家詳細(xì)介紹了基于curses庫實(shí)現(xiàn)彈球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語言實(shí)現(xiàn)24點(diǎn)游戲計算器的示例代碼

    C語言實(shí)現(xiàn)24點(diǎn)游戲計算器的示例代碼

    24點(diǎn)是一種益智游戲,24點(diǎn)是把4個整數(shù)(一般是正整數(shù))通過加減乘除以及括號運(yùn)算,使最后的計算結(jié)果是24的一個數(shù)學(xué)游戲,24點(diǎn)可以考驗(yàn)人的智力和數(shù)學(xué)敏感性,它能在游戲中提高人們的心算能力。本文將用C語言實(shí)現(xiàn)這一游戲,感興趣的可以了解一下
    2022-08-08
  • C++中如何實(shí)現(xiàn)回調(diào)的方法示例

    C++中如何實(shí)現(xiàn)回調(diào)的方法示例

    這篇文章主要給大家介紹了關(guān)于C++中如何實(shí)現(xiàn)回調(diào)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用c++具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • c語言中enum類型的用法案例講解

    c語言中enum類型的用法案例講解

    這篇文章主要介紹了c語言中enum類型的用法案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是本文的詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評論

晋州市| 南丰县| 陇西县| 南丹县| 尚义县| 喀什市| 桦川县| 东台市| 枣庄市| 乾安县| 册亨县| 新宁县| 丹东市| 北川| 岗巴县| 蒲城县| 敖汉旗| 淳安县| 正蓝旗| 宕昌县| 交城县| 陕西省| 哈巴河县| 永清县| 遂平县| 宝清县| 留坝县| 葫芦岛市| 东丽区| 瓮安县| 玉田县| 江口县| 石家庄市| 汤阴县| 迭部县| 漠河县| 都匀市| 巩留县| 北安市| 临湘市| 钦州市|