白話經典算法系列之中的一個 冒泡排序的三種實現

?冒泡排序是很easy理解和實現,,以從小到大排序舉例:

設數組長度為N。

1.比較相鄰的前后二個數據,假設前面數據大于后面的數據,就將二個數據交換。

2.這樣對數組的第0個數據到N-1個數據進行一次遍歷后,最大的一個數據就“沉”到數組第N-1個位置。

3.N=N-1,假設N不為0就反復前面二步,否則排序完畢。

?

依照定義非常easy寫出代碼:

//冒泡排序1
void BubbleSort1(int a[], int n)
{int i, j;for (i = 0; i < n; i++)for (j = 1; j < n - i; j++)if (a[j - 1] > a[j])Swap(a[j - 1], a[j]);
}


以下對其進行優化,設置一個標志,假設這一趟發生了交換,則為true,否則為false。明顯假設有一趟沒有發生交換,說明排序已經完畢。

//冒泡排序2
void BubbleSort2(int a[], int n)
{int j, k;bool flag;k = n;flag = true;while (flag){flag = false;for (j = 1; j < k; j++)if (a[j - 1] > a[j]){Swap(a[j - 1], a[j]);flag = true;}k--;}
}

再做進一步的優化。假設有100個數的數組,僅前面10個無序,后面90個都已排好序且都大于前面10個數字,那么在第一趟遍歷后,最后發生交換的位置必然小于10,且這個位置之后的數據必然已經有序了,記錄下這位置,第二次僅僅要從數組頭部遍歷到這個位置就能夠了。

//冒泡排序3
void BubbleSort3(int a[], int n)
{int j, k;int flag;flag = n;while (flag > 0){k = flag;flag = 0;for (j = 1; j < k; j++)if (a[j - 1] > a[j]){Swap(a[j - 1], a[j]);flag = j;}}
}

冒泡排序畢竟是一種效率低下的排序方法,在數據規模非常小時,能夠採用。數據規模比較大時,最好用其他排序方法。

轉載于:https://www.cnblogs.com/mfrbuaa/p/3963853.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376675.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376675.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376675.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何用java代碼讓android Market顯示指定的程序以便用戶下載?

Uri uri Uri.parse("market://search?q名稱");Intent i new Intent("Intent.ACTION_VIEW", uri);startActivity(i);//根據應用程序ID應用程序的包名Uri urii Uri.parse("market://details?idcom.xiaoqiu.test");Intent ii new Intent(&quo…

無鎖隊列設計思路以及簡要代碼

文章目錄非并發的一寫一讀環形隊列多讀多寫環形隊列非并發的一寫一讀環形隊列 讀指針&#xff1a; 1、先判斷是否有數據 2、讀取數據 3、操作指針 寫指針&#xff1a; 1、先判斷空間是否足夠 2、寫入數據 3、操作指針 所以代碼也十分簡單&#xff1a; bool putqueue(void* pDa…

vs 2012,vs 2013問題系列

系統環境&#xff1a; 64位 win7 1&#xff0c;問題&#xff1a; 之前能連接tfs進行源碼管理&#xff0c;期間有改過本地電腦的時間&#xff0c;再后來使用vs 2012連接tfs卻失敗了。錯誤碼&#xff1a;TF31002。排除了網絡問題&#xff0c;用戶權限問題&#xff0c;tfs服務器問…

Linux查看系統信息的一些命令

轉&#xff1a;http://www.cnblogs.com/chenwenbiao/archive/2011/07/18/2109983.html 系統 # uname -a # 查看內核/操作系統/CPU信息 # head -n 1 /etc/issue # 查看操作系統版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看計…

CPU Cache對于并發編程的影響

文章目錄引子CPU Cache對于并發的影響讀寫順序對性能的影響字節對齊對Cache的影響小結引子 下面給出兩個極其相似的代碼&#xff0c;運行出的時間卻是有很大差別&#xff1a; 代碼一 #include <stdio.h> #include <pthread.h> #include <stdint.h> #includ…

textarea 在瀏覽器中固定大小和禁止拖動

http://blog.sina.com.cn/s/blog_641d569301011naz.html HTML 標簽 textarea 在大部分瀏覽器中只要指定行&#xff08;rows&#xff09;和列&#xff08;cols&#xff09;屬性&#xff0c;就可以規定 textarea 的尺寸&#xff0c;大小就不會改變&#xff0c;不過更好的辦法是使…

hibernate操作時報錯

報錯&#xff1a;[ERROR] AbstractBatcher Exception executing batch: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1原因&#xff1a;視具體情況而定&#xff0c;我這邊是代碼被修改過…

bugfix:MySQL內存使用率無限增長以及kill手法

問題&#xff1a;昨天mysql 宕機了一次&#xff0c;重啟&#xff0c;然后繼續運行業務代碼的時候發現問題&#xff0c;mysql內存占用率上升較快&#xff0c;于是搜了搜&#xff0c;遇到一個&#xff1a; http://blog.itpub.net/29510932/viewspace-2129312/ 根據思路&#xff0…

軟工之初識

我們之前已經在完全不懂軟件工程的情況下&#xff0c;已經做完了兩個小系統&#xff0c;雖然能夠運行&#xff0c;但其中有很多的問題&#xff0c;學習軟工就是讓我們在工程學原理的指導之下去開發和設計軟件。 軟件工程同大多數書講的都是一樣的&#xff0c;首先對軟件工程有一…

perf +火焰圖使用

以mysqld進程為例&#xff1a; [rootVM-90-225-centos ~]# ps -ef | grep mysqld root 9808 9621 0 19:30 pts/7 00:00:00 grep --colorauto mysqld root 16104 1 0 17:30 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir/usr/loc…

Mysql 遇到的編碼問題。

今天幫小朋友做一個項目&#xff0c;碰到一個挺搞的問題。在幫她安裝mysql的時候一直是next&#xff0c;沒有去注意一些細節&#xff0c;不曉得有沒有漏掉設置編碼那一部分。。 結果在用sql文件導入數據庫MySQL -h localhost -u root -p xxx < e:\xxx.sql 執行的時候錯誤提…

在一個字符串中找到第一個只出現一次的字符

題目&#xff1a;在一個字符串中找到第一個只出現一次的字符&#xff0c;如輸入abaccdeff&#xff0c;則輸出b&#xff1b;具體實現如下&#xff1a;#include <iostream> #include <string> using namespace std; void FindChar(const string &strBuf) {int nA…

py腳本:獲取進程信息

這里以mysqld進程為例子 # pip install psutil import psutil import time import re, sys# x:進程name y:非進程name # 由于這里監控的是mysqld&#xff0c;如果不加限制的話會先識別mysqld_safe&#xff0c;所以要加上mysql_safe的判別 def processinfo(x, y):p_list psut…

sysctl -P 報錯解決辦法

sysctl -P 報錯解決辦法問題癥狀修改 linux 內核文件 #vi /etc/sysctl.conf后執行sysctl -P 報錯error: "net.bridge.bridge-nf-call-ip6tables" is an unknown keyerror: "net.bridge.bridge-nf-call-iptables" is an unknown keyerror: "net.bridg…

-bash: belts.awk: command not found

執行awk命令時&#xff0c;沒有問題。可是執行awk腳本時&#xff0c;出現這個問題&#xff1a;-bash: belts.awk: command not found。 既然之前直接執行awk命令沒有問題&#xff0c;說明awk已經裝了&#xff0c;本身是沒有問題的。那就說明路徑不對&#xff0c;執行echo $PATH…

nagios快速安裝

1、安裝軟件包&#xff08;準備軟件包&#xff09; yum install httpd gcc glibc glibc-common gd gd-devel 2、建立一個賬戶 創建一個名為nagios的帳號并給定登錄口令 /usr/sbin/useradd nagios passwd nagios 創建一個用戶組名為nagcmd用于從Web接口執行外部命令。將nagios用…

零拷貝機制在文件傳輸中的使用手法

文章目錄文件傳輸&#xff08;讀取與發送&#xff09;中的拷貝與上下文切換零拷貝技術sendfilesendfile SG-DMAmmap writespliceDirect I/O經典應用文件傳輸&#xff08;讀取與發送&#xff09;中的拷貝與上下文切換 如果服務端要提供文件傳輸的功能&#xff0c;最簡單的方式…

Effective Modern C++翻譯(3)-條款2:明白auto類型推導

條款2 明白auto類型推導 如果你已經讀完了條款1中有關模板類型推導的內容&#xff0c;那么你幾乎已經知道了所有關于auto類型推導的事情&#xff0c;因為除了一個古怪的例外&#xff0c;auto的類型推導規則和模板的類型推導規則是一樣的&#xff0c;但是為什么會這樣呢&#xf…

信息論與編碼復習

若信源有m種消息&#xff0c;且每個消息是以相等可能產生的&#xff0c;則該信源的信息量可表示為Ilogm。 信息率是通過接收到的信息可獲得的發送信息的信息量,即互信息。單位:bit/符號。 信息速率是單位時間內傳輸的信息量。單位:bit/s 碼字CodeWord。由若干個碼元組成&#x…

拖拽碰撞效果最終版

拖拽碰撞效果最終版&#xff0c;沒準還有bug&#xff0c;不過現在在各個瀏覽器下效果是對的&#xff0c;代碼需要精簡一些&#xff0c;以后有時間了在弄吧&#xff0c;現在先不理了&#xff0c;感冒了&#xff0c;沒有心情整理 <!DOCTYPE HTML> <html lang"en-US…