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

C語言qsort函數(shù)用冒泡排序?qū)崿F(xiàn)過程詳解

 更新時(shí)間:2023年02月14日 16:06:06   作者:_麥麥_  
qsort函數(shù)是由C語言提供的標(biāo)準(zhǔn)庫函數(shù), 它的實(shí)現(xiàn)思想是快速排序。這篇文章主要介紹了C語言中qsort函數(shù)用法及用冒泡排序?qū)崿F(xiàn)qsort函數(shù)功能,需要的可以參考一下

前言

這篇文章就是指針進(jìn)階的收尾環(huán)節(jié)了,相信看過C語言進(jìn)階——指針(下)的小伙伴一定還記著文章末尾的回調(diào)函數(shù)吧。這篇文章就是借qsort函數(shù)的模擬實(shí)現(xiàn)來給小伙伴們展示一下回調(diào)函數(shù)的運(yùn)用。

1.冒泡排序的實(shí)現(xiàn)

在實(shí)現(xiàn)qsort函數(shù),相信有的小伙伴對(duì)冒泡排序還存有疑惑,甚至是第一次接觸這個(gè)名詞,那么我們就先來講講冒泡排序。

1.1冒泡排序的概念

“冒泡排序(Bubble Sort),是一種計(jì)算機(jī)科學(xué)領(lǐng)域的較簡(jiǎn)單的排序算法。它重復(fù)地走訪過要排序的元素列,依次比較兩個(gè)相鄰的元素,如果順序(如從大到小、首字母從Z到A)錯(cuò)誤就把他們交換過來。走訪元素的工作是重復(fù)地進(jìn)行,直到?jīng)]有相鄰元素需要交換,也就是說該元素列已經(jīng)排序完成。這個(gè)算法的名字由來是因?yàn)樵叫〉脑貢?huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會(huì)上浮到頂端一樣,故名“冒泡排序”。

相信聰明的你已經(jīng)知道了冒泡排序是一種依次比較相鄰元素并按照相應(yīng)規(guī)則進(jìn)行排序的排序方法。

在這種排序過程中,重要的元素共有兩個(gè),分別是冒泡排序的趟數(shù)以及比較的次數(shù)。一般而言,趟數(shù)是元素的個(gè)數(shù)減一得到,為什么不等于元素的個(gè)數(shù)呢?因?yàn)槊窟M(jìn)行一趟冒泡排序,就會(huì)有一個(gè)元素來到它正確的位置,所以當(dāng)除了最后一個(gè)元素以外的其他元素都來到了正確位置的時(shí)候,那么最后一個(gè)元素也一定處于正確位置。

說完趟數(shù),再來聊聊比較次數(shù)。有親自實(shí)踐的小伙伴們一定發(fā)現(xiàn)了在進(jìn)行第一趟冒泡排序的時(shí)候,比較的次數(shù)是最多的,是除了第一個(gè)元素以外的所有元素都要與之比較,也就是元素的個(gè)數(shù)減一,但是隨著趟數(shù)的增加,比較的次數(shù)也會(huì)隨之減少,究其原因,是因?yàn)槊拷?jīng)過一次冒泡排序,就會(huì)有一個(gè)元素來到正確的位置,那么這個(gè)正確的元素也就無需參加后續(xù)的比較了。

那么具體的代碼實(shí)現(xiàn)究竟是怎么樣呢?接下來就讓我們一起揭開它神秘的面紗,一探究竟!

1.2具體代碼的實(shí)現(xiàn)

void bubble_sort(int arr[], int sz)
{
	//趟數(shù)
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		//一趟冒泡排序的過程
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
            }
		}
	}
}

2.qsort函數(shù)

在了解完冒泡排序之后,有的小伙伴還是第一次見到qsort函數(shù),那么下面我們就來簡(jiǎn)單介紹一下qsort函數(shù)。

首先我們要清楚的是qsort函數(shù)是庫里面的函數(shù),所以我們?cè)谑褂玫臅r(shí)候要引用頭文件<stdlib.h>。

然后我們?cè)賮砹私庖幌逻@個(gè)函數(shù)的各個(gè)部分。第一個(gè)是返回類型,從上圖中我們可以看到返回類型是void,也就是說當(dāng)我們?cè)谝眠@個(gè)函數(shù)的時(shí)候,它并不會(huì)返回任何參數(shù)。第二個(gè)是參數(shù)部分,第一個(gè)參數(shù)是一個(gè)指針變量,第二、三個(gè)參數(shù)是無符號(hào)的整型變量,第四個(gè)就是我們之前講解過的函數(shù)指針變量。在第四個(gè)參數(shù)部分也就體現(xiàn)了回調(diào)函數(shù)這一功能。

最后我們來講講這個(gè)函數(shù)該怎么使用。在引用完頭文件后,我們下一步就是要對(duì)這個(gè)函數(shù)進(jìn)行傳參,在意義上分別是要排序的對(duì)象,元素個(gè)數(shù),元素大?。ㄒ宰止?jié)為單位),判斷是否交換的函數(shù)(根據(jù)需求自寫)。

說到第四個(gè)參數(shù)所指向的函數(shù)需要根據(jù)需求自己來寫,可能有小伙伴就疑惑了,到底要怎么寫呢。別怕,上面這幅圖片可以說是為我們函數(shù)的書寫提供了方向。首先你要確保你書寫的函數(shù)的返回類型為int,并且依據(jù)交換的原則來進(jìn)行返回值的代碼書寫。拿整型數(shù)組排序?yàn)槔?,如果你想要最終數(shù)組的整形呈現(xiàn)升序排序,那么如果兩個(gè)數(shù)是降序排序就應(yīng)該返回小于0的整型。具體代碼的實(shí)現(xiàn)如下,以整形數(shù)組和結(jié)構(gòu)體為例。

//用qsort函數(shù)實(shí)現(xiàn)各種類型的排序
//整形數(shù)組的排序
int cmp_int(void const* e1, void const* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int i = 0;
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, 4, cmp_int);
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}
//結(jié)構(gòu)體的排序
struct stu
{
	char name[20];
	int  age;
};
int cmp_age(void const*e1, void const*e2)
{
	return (((struct stu*)e1)->age - ((struct stu*)e2)->age);
}
int cmp_name(void const* e1, void const* e2)
{
	return strcmp(((struct stu*)e1)->name ,((struct stu*)e2)->name);
}
int main()
{
	struct stu Stu[3] = { {"zhangsan", 20},{"wangwu", 42},{"lisi",29}};
	int sz = sizeof(Stu) / sizeof(Stu[0]);
	//qsort(Stu, sz, sizeof(Stu[0]), cmp_age);
	qsort(Stu, sz, sizeof(Stu[0]), cmp_name);
	return 0;
}

3.qsort函數(shù)的實(shí)現(xiàn)

隨著我們學(xué)習(xí)的不斷深入,類型的不斷豐富,我們會(huì)發(fā)現(xiàn)上面的冒泡排序已然滿足不了我們的需求,諸如結(jié)構(gòu)體的排序,這種代碼已經(jīng)是無能為力了。那么接下來我們就自己來利用冒泡排序的原理來書寫qsort函數(shù)。

//實(shí)現(xiàn)元素的交換
void swap(char* e1, char* e2, size_t sz)
{
	size_t i = 0;
	for (i = 0; i < sz; i++)
	{
		char tmp = 0;
		tmp = *e1;
		*e1 = *e2;
		*e2 = tmp;
		e1++;
		e2++;
	}
}
//qsort函數(shù)的自定義
void bubble_sort(void* base, size_t num, size_t size, int (*compar)(const void*e1, const void*e2))
{
	size_t i = 0;
	size_t j = 0;
	//冒泡排序的趟數(shù)
	for (i = 0; i < num-1; i++)
		{
			//比較的次數(shù)
			for (j = 0; j < num - i - 1; j++)
			{
				if (compar((char *)base+j*size,(char*)base+(j+1)*size)>0)
				{
					//交換
					swap((char*)base + j*size, (char*)base + (j + 1)*size, size);
				}
			}
		}
}

到此這篇關(guān)于C語言qsort函數(shù)用冒泡排序?qū)崿F(xiàn)過程詳解的文章就介紹到這了,更多相關(guān)C語言qsort函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++20 統(tǒng)一容器擦除:std::erase 和 std::eraseif的實(shí)現(xiàn)

    C++20 統(tǒng)一容器擦除:std::erase 和 std::eraseif的實(shí)現(xiàn)

    本文主要介紹了C++20 統(tǒng)一容器擦除:std::erase 和 std::erase_if的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • C/C++中輸入多組數(shù)據(jù)的方法

    C/C++中輸入多組數(shù)據(jù)的方法

    這篇文章主要為大家詳細(xì)介紹了C/C++中輸入多組數(shù)據(jù)的三種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C++代碼實(shí)現(xiàn)五子棋小游戲

    C++代碼實(shí)現(xiàn)五子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C++代碼實(shí)現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 200行C語言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲

    200行C語言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲

    三子棋(井字棋)我們的童年或多或少都體驗(yàn)過這個(gè)游戲的樂趣,本子隨手一畫就是一局游戲的開始,下面這篇文章主要給大家介紹了關(guān)于200行C語言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • C++實(shí)現(xiàn)回文串判斷的兩種高效方法

    C++實(shí)現(xiàn)回文串判斷的兩種高效方法

    文章介紹了兩種判斷回文串的方法:解法一通過創(chuàng)建新字符串來處理,解法二在原字符串上直接篩選判斷,兩種方法都使用了雙指針法,文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Qt實(shí)現(xiàn)指針式時(shí)鐘 Qt實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘

    Qt實(shí)現(xiàn)指針式時(shí)鐘 Qt實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)指針式時(shí)鐘,Qt實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘,兩者相互切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • c語言程序調(diào)試方法整理

    c語言程序調(diào)試方法整理

    在本篇文章里小編給大家正里的是關(guān)于c語言程序調(diào)試方法整理內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • 利用C語言實(shí)踐OOP,以及new,delete的深入分析

    利用C語言實(shí)踐OOP,以及new,delete的深入分析

    本篇文章是對(duì)用C語言實(shí)踐OOP,new,delete進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 使用C++構(gòu)建一個(gè)優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn)

    使用C++構(gòu)建一個(gè)優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn)

    優(yōu)先級(jí)隊(duì)列是一種特殊的隊(duì)列數(shù)據(jù)結(jié)構(gòu),本文主要介紹了使用C++構(gòu)建一個(gè)優(yōu)先級(jí)隊(duì)列的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • 教你在VS2022?MFC程序中調(diào)用CUDA代碼的方法

    教你在VS2022?MFC程序中調(diào)用CUDA代碼的方法

    這篇文章主要介紹了在VS2022?MFC程序中調(diào)用CUDA代碼,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04

最新評(píng)論

尚志市| 巴南区| 抚宁县| 西昌市| 靖宇县| 惠州市| 凤山县| 安新县| 清徐县| 鹤山市| 成武县| 南通市| 贵定县| 四川省| 隆尧县| 剑川县| 安图县| 珠海市| 伊吾县| 新野县| 称多县| 吴桥县| 宜丰县| 隆回县| 梅河口市| 张掖市| 红桥区| 郎溪县| 晴隆县| 城市| 株洲市| 信阳市| 定边县| 保亭| 土默特右旗| 汉川市| 泗洪县| 涡阳县| 平原县| 方正县| 马尔康县|