在開發中,對一組資料進行有序地排列是經常需要做的事情,所以掌握幾種甚至更多的排序演算法是絕對有必要的
本文章介紹的是排序演算法中較簡單的一種演算法:冒泡排序
先嘗試用最簡單的想法去實現排序,以此來比較學習冒泡排序
問題:設有一數組,其大小為10個元素(int str[10])數組內的數據是無序。現在要求我們透過程式將這個無序的陣列變成一個從小到大排序的陣列(從下標為0開始)
思路:按照題目的要求,毫無疑問,正確的結果應該就像這樣: 1 2 3 4 5 6 7 8 9 10 要做到這樣,最簡單且最直接想到的方法就是進行對比交換。
首先,將10個數裡最小的個數放到下標為0的位置上(str[0])
通過將下標為0的數(str[0])與剩下其餘9個數字進行對比交換(將較少者放置在下標為0的位置上),就可以得到這10個數最小的那個
10個數最小的那位確定後,接下來就要找剩下9個數最小的那個。
因為已經確定出一個最小的數,所以就不要動str[0],直接從str[1]開始,與剩下的8個數對比交換,找出9個數中最小的那位放到下標為1(str[1])的位置上
繼續按照這個思路就可以將這十個數變成有序的(從小到大)的數組
代碼:
#include <stdio.h> void swap(int *a, int *b); //交换两个数 int main() { int str[10]; int i, j; //初始化数组为10 9 8 7 6 5 4 3 2 1 for (i = 0; i < 10; i++) { str[i] = 10 - i; } //排序,从a[0]开始排,从小到大 for (i = 0; i < 10; i++) { for (j = i + 1; j < 10; j++) { if (str[i] > str[j]) { swap(&str[i], &str[j]); } } } //将十个数输出 for (i = 0; i < 10; i++) printf("%d\n", str[i]); return 0; } void swap(int *a, int *b) { int c; c = *a; *a = *b; *b = c; }
這個方法是比較容易想到的實作方法。但存在不足:就是原本位於前面的較小數字被交換到後面
演示:
開始:9 4 5 6 8 3 2 7 10 1 (下標從左到右分別是0~9)依照上面的程序進行比較交換
第一次:4 9 5 6 8 3 2 7 10 1
第二次:4 9 5 6 8 3 2 7 10 1
。 。 。 :(無交換)
第五次:3 9 5 6 8 4 2 7 10 1
第六次:2 9 5 6 8 3 4 7 10 1
。 。 。 :(沒有交換)
第十次:1 9 5 6 8 3 4 7 10 2
可以看出,原來較小的數是在前面的,經過一輪的交換後放到後面了
那麼怎樣解決這個不足呢?可以使用冒泡排序
什麼是冒泡排序呢?
你可以這樣理解:(從小到大排序)存在10個不同大小的氣泡,由底至上地把較少的氣泡逐步地向上升,這樣經過遍歷一次後,最小的氣泡就會被上升到頂(下標為0),然後再從底至上地這樣升,循環直到十個氣泡大小有序。
在冒泡排序中,最重要的思想是兩兩比較,將兩者較少的升上去
冒泡排序最壞情況的時間複雜度是O(n²)
代碼:
#include <stdio.h> void swap(int *a, int *b); int main() { int array[10] = {15, 225, 34, 42, 52, 6, 7856, 865, 954, 10}; int i, j; for (i = 0; i < 10; i++) { //每一次由底至上地上升 for (j = 9; j > i; j--) { if (array[j] < array[j-1]) { swap(&array[j], &array[j-1]); } } } for (i = 0; i < 10; i++) { printf("%d\n", array[i]); } return 0; } void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; }
冒泡排序演算法只會將較少的逐步向上推,不會造成文章前面所說的不足,這裡就不給予示範。
更多排序演算法入門之冒泡排序相關文章請關注PHP中文網!

如何实现C#中的冒泡排序算法冒泡排序是一种简单但有效的排序算法,它通过多次比较相邻的元素并交换位置来排列一个数组。在本文中,我们将介绍如何使用C#语言实现冒泡排序算法,并提供具体的代码示例。首先,让我们了解一下冒泡排序的基本原理。算法从数组的第一个元素开始,与下一个元素进行比较。如果当前元素比下一个元素大,则交换它们的位置;如果当前元素比下一个元素小,则保持

如何编写自定义PHP数组排序算法?冒泡排序:通过比较和交换相邻元素来排序数组。选择排序:每次选择最小或最大元素并将其与当前位置交换。插入排序:逐个插入元素到有序部分。

C++函数性能优化算法选择:选择高效算法(如快速排序、二分查找)。优化技巧:内联小型函数、优化缓存、避免深拷贝、循环展开。实战案例:查找数组最大元素位置时,优化后采用二分查找和循环展开,大幅提升性能。

冒泡事件是指在Web开发中,当一个元素上触发了某个事件后,该事件将会向上层元素传播,直到达到文档根元素。这种传播方式就像气泡从底部逐渐冒上来一样,因此被称为冒泡事件。在实际开发中,了解和理解冒泡事件的工作原理对于正确处理事件十分重要。下面将通过具体的代码示例来详细介绍冒泡事件的概念和使用方法。首先,我们创建一个简单的HTML页面,其中包含一个父级元素和三个子

Go语言是一种越来越流行的编程语言,它被设计成易于编写、易于阅读和易于维护的语言,同时也支持高级编程概念。时间复杂度和空间复杂度是算法和数据结构分析中重要的概念,它们衡量着一个程序的执行效率和占用内存大小。在本文中,我们将重点分析Go语言中的时间复杂度和空间复杂度。时间复杂度时间复杂度是指算法执行时间与问题规模之间的关系。通常用大O表示法来表示时间

Python、Java和C++:哪个编程语言更值得学习?作为计算机科学领域中最常见的编程语言之一,Python、Java和C++各自具有独特的特点和优势。选择学习哪种编程语言往往取决于个人的兴趣、职业需求和项目要求。在选择编程语言时,比较它们的特性和适用场景是非常重要的。接下来将分别探讨这三种编程语言的特点,并给出相应的代码示例。Python:Python是

冒泡排序是一种简单但效率较低的排序算法,它的原理是通过相邻元素之间的比较和交换,将最大的元素逐渐“冒泡”到数组的末尾,冒泡排序的时间复杂度为O(n^2),其中n是待排序数组的长度。详细介绍:从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置,一轮比较下来,最大的元素就会“冒泡”到数组的末尾,再从数组的第一个元素开始,重复上操作等等。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver Mac版
視覺化網頁開發工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。