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

C語(yǔ)言中冒泡排序算法詳解

 更新時(shí)間:2022年01月18日 09:45:09   作者:pineapple_py  
大家好,本篇文章主要講的是C語(yǔ)言中冒泡排序算法詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下

一、算法描述

比較相鄰兩個(gè)元素,如果第一個(gè)比第二個(gè)大則交換兩個(gè)值。遍歷所有的元素,每一次都會(huì)將未排序序列中最大的元素放在后面。假設(shè)數(shù)組有 n 個(gè)元素,那么需要遍歷 n - 1 次,因?yàn)槭O碌囊粋€(gè)元素一定是最小的,無(wú)需再遍歷一次。因此需要兩層循環(huán),第一層是遍歷次數(shù),第二層是遍歷未排序數(shù)組。

動(dòng)圖如下:

黃色部分表示已排好序的數(shù)組,藍(lán)色部分表示未排序數(shù)組

核心代碼如下:

/**
 * @brief 冒泡排序
 * 
 * @param arr 待排序的數(shù)組
 * @param size 數(shù)組大小
 */
static void bubble_sort(int *arr, int size)
{
	for (int i = 0; i < size - 1; i++) {
		bool swapped = false; // 設(shè)置標(biāo)記,用于檢查是否已排好序
		for (int j = 0; j < size - i; j++)
			if (arr[j] > arr[j + 1]) {
				swap(arr + j, arr + j + 1);
				swapped = true;
			}
		if (!swapped) // 未交換則排序完畢,跳出循環(huán)
			break;
	}
}

布爾值 swapped 是一種優(yōu)化手段,在每次遍歷未排序數(shù)組之前將其設(shè)置為 false 表示還未交換。如果遍歷完未排序數(shù)組之后其值還是 false 則表示遍歷過(guò)程種沒(méi)有發(fā)生交換,也就是說(shuō)數(shù)組已經(jīng)有序,無(wú)需再次遍歷,跳出循環(huán)。

二、算法分析

時(shí)間復(fù)雜度:O(N2),兩層循環(huán)

空間復(fù)雜度:O(1),交換元素時(shí)只用了一個(gè)臨時(shí)變量

最好情況:O(N),有序數(shù)組遍歷一次后 swapped 為 false 退出循環(huán)

最壞情況:O(N2),數(shù)組倒序

穩(wěn)定性:穩(wěn)定,比較兩個(gè)元素大小時(shí)不包括元素相等的情況,故相等元素的相對(duì)位置不變

三、完整代碼

/**
 * @file bubble_sort.c
 * @date 2022-01-16
 * @author Pineapple (pineapple_cpp@163.com)
 * 
 * @brief 冒泡排序
 */

#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/**
 * @brief 交換函數(shù)
 * 
 * @param left 左邊的元素
 * @param right 右邊的元素
 */
static inline void swap(int *left, int *right)
{
	int temp = *left;
	*left = *right;
	*right = temp;
}

/**
 * @brief 冒泡排序
 * 
 * @param arr 待排序的數(shù)組
 * @param size 數(shù)組大小
 */
static void bubble_sort(int *arr, int size)
{
	for (int i = 0; i < size - 1; i++) {
		bool swapped = false; // 設(shè)置標(biāo)記,用于檢查是否已排好序
		for (int j = 0; j < size - i; j++)
			if (arr[j] > arr[j + 1]) {
				swap(arr + j, arr + j + 1);
				swapped = true;
			}
		if (!swapped) // 未交換則排序完畢,跳出循環(huán)
			break;
	}
}

/**
 * @brief 測(cè)試函數(shù)
 * 
 */
static void test()
{
	const int size = rand() % 500; // 生成隨機(jī)數(shù)組大小
	int *arr = (int *)calloc(size, sizeof(int));

	// 生成范圍 -50 到 49 的隨機(jī)數(shù)組
	for (int i = 0; i < size; i++)
		arr[i] = rand() % 100 - 50;

	bubble_sort(arr, size);

	for (int i = 0; i < size - 1; i++)
		assert(arr[i] <= arr[i + 1]);

	free(arr);
}

int main(void)
{
	srand(time(NULL));
	test();
	return 0;
}

總結(jié)

到此這篇關(guān)于C語(yǔ)言中冒泡排序算法詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言冒泡排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存

    淺談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存

    下面小編就為大家?guī)?lái)一篇淺談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(Map實(shí)現(xiàn))

    C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(Map實(shí)現(xiàn))

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • OpenCV reshape函數(shù)實(shí)現(xiàn)矩陣元素序列化

    OpenCV reshape函數(shù)實(shí)現(xiàn)矩陣元素序列化

    reshape函數(shù)是OpenCV中一個(gè)很有用的函數(shù),不僅可以改變矩陣的通道數(shù),還可以對(duì)矩陣元素進(jìn)行序列化。本文將主要介紹如何通過(guò)reshape實(shí)現(xiàn)矩陣元素序列化,需要的小伙伴可以參考一下
    2021-12-12
  • C語(yǔ)言超全面覆蓋操作符知識(shí)點(diǎn)

    C語(yǔ)言超全面覆蓋操作符知識(shí)點(diǎn)

    C?語(yǔ)言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。讓我們通讀本篇來(lái)詳細(xì)了解吧
    2022-06-06
  • 數(shù)據(jù)結(jié)構(gòu)之帶頭結(jié)點(diǎn)的單鏈表

    數(shù)據(jù)結(jié)構(gòu)之帶頭結(jié)點(diǎn)的單鏈表

    單鏈表是一種鏈?zhǔn)酱嫒〉臄?shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲(chǔ)單元存放線性表中的數(shù)據(jù)元素。鏈表中的數(shù)據(jù)是以結(jié)點(diǎn)來(lái)表示的,每個(gè)結(jié)點(diǎn)的構(gòu)成:數(shù)據(jù)域(數(shù)據(jù)元素的映象)?+?指針域(指示后繼元素存儲(chǔ)位置),元素就是存儲(chǔ)數(shù)據(jù)的存儲(chǔ)單元,指針就是連接每個(gè)結(jié)點(diǎn)的地址數(shù)據(jù)
    2023-07-07
  • C++二叉搜索樹BSTree使用詳解

    C++二叉搜索樹BSTree使用詳解

    二叉搜索樹(Binary Search Tree)又稱二叉排序樹,也稱作二叉查找樹它或者是一棵空樹,或者是具有以下性質(zhì)的二叉樹,若它的左子樹不為空,則左子樹上所有節(jié)點(diǎn)的值都小于根節(jié)點(diǎn)的值,若它的右子樹不為空,則右子樹上所有節(jié)點(diǎn)的值都大于根節(jié)點(diǎn)的值
    2023-03-03
  • C/C++調(diào)用Fortran的DLL的操作過(guò)程

    C/C++調(diào)用Fortran的DLL的操作過(guò)程

    這篇文章主要介紹了C/C++調(diào)用Fortran的DLL,本文以一個(gè)簡(jiǎn)單的加法器為例,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • 用C語(yǔ)言實(shí)現(xiàn)從文本文件中讀取數(shù)據(jù)后進(jìn)行排序的功能

    用C語(yǔ)言實(shí)現(xiàn)從文本文件中讀取數(shù)據(jù)后進(jìn)行排序的功能

    這是一個(gè)十分可靠的程序,這個(gè)程序的查錯(cuò)能力非常強(qiáng)悍。程序包含了文件操作,歸并排序和字符串輸入等多種技術(shù)。對(duì)大家學(xué)習(xí)C語(yǔ)言很有幫助,有需要的一起來(lái)看看。
    2016-08-08
  • 探討++i與i++哪個(gè)效率更高

    探討++i與i++哪個(gè)效率更高

    i++總是要?jiǎng)?chuàng)建一個(gè)臨時(shí)對(duì)象,在退出函數(shù)時(shí)還要銷毀它,而且返回臨時(shí)對(duì)象的值時(shí)還會(huì)調(diào)用其拷貝構(gòu)造函數(shù)
    2013-10-10
  • C++ QgraphicsScene類案例詳解

    C++ QgraphicsScene類案例詳解

    這篇文章主要介紹了C++ QgraphicsScene類案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

双牌县| 安新县| 迭部县| 石林| 柘城县| 柳河县| 棋牌| 厦门市| 双牌县| 宁波市| 隆尧县| 巧家县| 佛山市| 贺州市| 洪江市| 襄汾县| 满洲里市| 花莲市| 河东区| 乌拉特后旗| 合川市| 屯门区| 班戈县| 甘泉县| 荥阳市| 南京市| 五莲县| 海宁市| 枣阳市| 定兴县| 阜宁县| 南京市| 邹城市| 图木舒克市| 麻江县| 临安市| 铜山县| 汕头市| 泰兴市| 开化县| 临桂县|