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

C語言冒泡排序超全面實(shí)現(xiàn)流程

 更新時(shí)間:2023年01月13日 08:43:44   作者:小智_x0__0x_  
算法中排序是十分重要的,而每一個(gè)學(xué)習(xí)計(jì)算機(jī)的都會(huì)在初期的時(shí)候接觸到這種排序,下面這篇文章主要給大家介紹了關(guān)于c語言冒泡排序的相關(guān)資料,需要的朋友可以參考下

普通版冒泡排序

冒泡排序想必大家都很了解了吧,冒泡排序的算法思想就是兩兩比大小,一輪一輪比,每比完一輪排出一個(gè)數(shù)字的順序,那就讓我們先來看一個(gè)普通的冒泡排序代碼>

void bubble_sort(int arr[], int sz)//參數(shù)接收數(shù)組元素個(gè)數(shù)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	bubble_sort(arr, sz);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

先看代碼效果>

可以看到數(shù)組中的內(nèi)容變成了由小到大的順序,那如何讓數(shù)組成為由大到小的順序呢?很簡單我們只需要把if (arr[j] > arr[j + 1])中的>改成<,我們來看看效果>

void bubble_sort(int arr[], int sz)//參數(shù)接收數(shù)組元素個(gè)數(shù)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - i - 1; j++)
		{
			if (arr[j] < arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
int main()
{
	int arr[] = { 3,1,7,5,8,9,0,2,4,6 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	bubble_sort(arr, sz);
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

這樣就達(dá)到了我們最終的效果了。

但是我們發(fā)現(xiàn),普通的冒泡排序只能對(duì)整型的數(shù)據(jù)進(jìn)行排序而其它類型的則無法排序,這就不得不動(dòng)動(dòng)我們的發(fā)財(cái)?shù)男∧X袋,其實(shí)C語言庫函數(shù)中有一個(gè)qsort函數(shù),這里我們先學(xué)習(xí)一下qsort函數(shù)的使用方法:我們可以打開我們的MSDN這款軟件。

qosrt函數(shù)

打開MSDN搜索qsort我們可以看到函數(shù)的定義:

有道翻譯>

我們可以看到qsort函數(shù)參數(shù)分別是數(shù)組地址、數(shù)組元素個(gè)數(shù)、數(shù)組元素大?。ㄗ止?jié))、一個(gè)比較函數(shù),返回值為void.,其內(nèi)部實(shí)現(xiàn)了一個(gè)快速排序算法,對(duì)一個(gè)num元素進(jìn)行排序,每個(gè)元素都是width字節(jié),參數(shù)base是一個(gè)指針,指向要排序數(shù)組的首元素地址,qsort用已經(jīng)排序的元素覆蓋這個(gè)數(shù)組,compare是一個(gè)函數(shù)指針,再使用的同時(shí)我們要自己書寫比較函數(shù)int_cmp。

我們來代碼演示一下>

int int_cmp(const void* p1, const void* p2)
{
	return (*(int*)p1 - *(int*)p2);
}
int main()
{
	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
	int i = 0;
	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

看效果>

如果需要由大到小排序的話只需將int_cmp函數(shù)中的p1和p2互換就可以啦。

終極版冒泡排序

學(xué)完了qsort函數(shù),我們可以模仿qosrt函數(shù)來改裝我們的冒泡排序>

我們可以將我們的冒泡排序函數(shù)也改為四個(gè)參數(shù):

void bubble_sort(void* base, size_t sz, size_t width, int(*cmp)(const void*, const void*))

比較函數(shù)部分>

int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int cmp_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
int cmp_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}

分別為int、結(jié)構(gòu)體字符型、結(jié)構(gòu)體整型。

冒泡排序函數(shù)>

void bubble_sort(void* base, size_t sz, size_t width, int(*cmp)(const void*, const void*))
{
	size_t i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		size_t j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}

Swap函數(shù)>

void Swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}

Swap函數(shù)的功能是將元素以一個(gè)字節(jié)的大小進(jìn)行交換交換width次。

這樣我們就可以寫出可以排序任意類型元素的冒泡排序了

終極版冒泡排序整體測試代碼

struct Stu
{
	char name[20];
	int age;
};
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int cmp_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
int cmp_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
void Swap(char* buf1, char* buf2, int width)
{
	int i = 0;
	for (i = 0; i < width; i++)
	{
		char tmp = *buf1;
		*buf1 = *buf2;
		*buf2 = tmp;
		buf1++;
		buf2++;
	}
}
void bubble_sort(void* base, size_t sz, size_t width, int(*cmp)(const void*, const void*))
{
	size_t i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		size_t j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
			{
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}
void test1()
{
	int arr[10] = { 2,5,9,1,3,6,4,7,8,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}
void test2()
{
	struct Stu a[3] = { {"zhangsan",18},{"lisi",15},{"wangwu",25} };
	int sz = sizeof(a) / sizeof(a[0]);
	bubble_sort(a, sz, sizeof(a[0]), cmp_by_name);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%s ", a[i].name);
	}
	printf("\n");
}
void test3()
{
	struct Stu a[3] = { {"zhangsan",18},{"lisi",15},{"wangwu",25} };
	int sz = sizeof(a) / sizeof(a[0]);
	bubble_sort(a, sz, sizeof(a[0]), cmp_by_age);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", a[i].age);
	}
	printf("\n");
}
int main()
{
	test1();
	test2();
	test3();
	return 0;
}

運(yùn)行結(jié)果>

代碼gitee

到此這篇關(guān)于C語言冒泡排序超全面實(shí)現(xiàn)流程的文章就介紹到這了,更多相關(guān)C語言冒泡排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解如何將c語言文件打包成exe可執(zhí)行程序

    詳解如何將c語言文件打包成exe可執(zhí)行程序

    這篇文章主要介紹了詳解如何將c語言文件打包成exe可執(zhí)行程序,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • C語言基礎(chǔ)知識(shí)變量的作用域和存儲(chǔ)方式詳細(xì)介紹

    C語言基礎(chǔ)知識(shí)變量的作用域和存儲(chǔ)方式詳細(xì)介紹

    這篇文章主要介紹了C語言基礎(chǔ)知識(shí)變量的作用域和存儲(chǔ)方式詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Visual Studio C++指針靠前靠后的問題全面解析

    Visual Studio C++指針靠前靠后的問題全面解析

    這篇文章主要介紹了Visual Studio C++指針靠前靠后的問題全面解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 深入淺出理解C語言初識(shí)結(jié)構(gòu)體

    深入淺出理解C語言初識(shí)結(jié)構(gòu)體

    C?數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是?C?編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng),本篇讓我們來了解C?的結(jié)構(gòu)體
    2022-02-02
  • C++類和對(duì)象之類的6個(gè)默認(rèn)成員函數(shù)詳解

    C++類和對(duì)象之類的6個(gè)默認(rèn)成員函數(shù)詳解

    類是對(duì)某一事物的抽象描述,具體地講類是C++中的一種構(gòu)造的數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于C++類和對(duì)象之類的6個(gè)默認(rèn)成員函數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • C語言中動(dòng)態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)解析

    C語言中動(dòng)態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)解析

    C語言跟內(nèi)存申請(qǐng)相關(guān)的函數(shù)主要有 alloca、calloc、malloc、free、realloc等,下面這篇文章主要給大家介紹了關(guān)于C語言中動(dòng)態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • C語言中強(qiáng)制類型轉(zhuǎn)換的常見方法

    C語言中強(qiáng)制類型轉(zhuǎn)換的常見方法

    強(qiáng)制類型轉(zhuǎn)換是一種將一個(gè)數(shù)據(jù)類型轉(zhuǎn)換為另一個(gè)數(shù)據(jù)類型的方法,這篇文章主要為大家整理了C語言中強(qiáng)制類型轉(zhuǎn)換的方法,需要的可以參考一下
    2023-05-05
  • C/C++使用fmt庫實(shí)現(xiàn)格式化字符串

    C/C++使用fmt庫實(shí)現(xiàn)格式化字符串

    fmt庫是一個(gè)高效、易用的C++格式化庫,可以幫助我們方便地進(jìn)行字符串格式化、輸出、日志記錄等操作,下面我們就來學(xué)習(xí)一下fmt格式化字符串的具體操作吧
    2023-12-12
  • C++類中的運(yùn)算符重載過程

    C++類中的運(yùn)算符重載過程

    文章介紹了運(yùn)算符重載在C++中的重要性以及實(shí)現(xiàn)方法,包括加法運(yùn)算符重載、左移運(yùn)算符重載、遞增運(yùn)算符重載、+=運(yùn)算符重載、關(guān)系運(yùn)算符重載和賦值運(yùn)算符重載
    2024-11-11
  • c語言實(shí)現(xiàn)基數(shù)排序解析及代碼示例

    c語言實(shí)現(xiàn)基數(shù)排序解析及代碼示例

    這篇文章主要介紹了c語言實(shí)現(xiàn)基數(shù)排序解析及代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12

最新評(píng)論

师宗县| 越西县| 蒙山县| 吉木萨尔县| 和硕县| 永年县| 长兴县| 玛曲县| 连城县| 开远市| 大安市| 山东| 古交市| 城固县| 鄂伦春自治旗| 太仆寺旗| 清新县| 牡丹江市| 梅河口市| 孟州市| 吉木萨尔县| 江陵县| 博罗县| 莎车县| 新源县| 汉阴县| 长治县| 吉首市| 潼关县| 德兴市| 安平县| 静宁县| 裕民县| 六盘水市| 宁夏| 冕宁县| 中卫市| 易门县| 广昌县| 扶沟县| 奉贤区|