網(wǎng)站首頁 編程語言 正文
前言
在實際開發(fā)中,有很多場景需要我們將數(shù)組元素按照從大到?。ɑ蛘邚男〉酱螅┑捻樞蚺帕校@樣在查閱數(shù)據(jù)時會更加直觀,例如:
- 一個保存了班級學(xué)號的數(shù)組,排序后更容易分區(qū)好學(xué)生和壞學(xué)生;
- 一個保存了商品單價的數(shù)組,排序后更容易看出它們的性價比。
對數(shù)組元素進行排序的方法有很多種,比如冒泡排序、歸并排序、選擇排序、插入排序、快速排序等,其中最經(jīng)典最需要掌握的是「冒泡排序」。
以從小到大排序為例,冒泡排序的整體思想是這樣的:
- 從數(shù)組頭部開始,不斷比較相鄰的兩個元素的大小,讓較大的元素逐漸往后移動(交換兩個元素的值),直到數(shù)組的末尾。經(jīng)過第一輪的比較,就可以找到最大的元素,并將它移動到最后一個位置。
- 第一輪結(jié)束后,繼續(xù)第二輪。仍然從數(shù)組頭部開始比較,讓較大的元素逐漸往后移動,直到數(shù)組的倒數(shù)第二個元素為止。經(jīng)過第二輪的比較,就可以找到次大的元素,并將它放到倒數(shù)第二個位置。
- 以此類推,進行 n-1(n 為數(shù)組長度)輪“冒泡”后,就可以將所有的元素都排列好。
整個排序過程就好像氣泡不斷從水里冒出來,最大的先出來,次大的第二出來,最小的最后出來,所以將這種排序方式稱為冒泡排序(Bubble Sort)。
下面我們以“3 2 4 1”為例對冒泡排序進行說明。
第一輪 排序過程
3 2 4 1 (最初)
2 3 4 1 (比較3和2,交換)
2 3 4 1 (比較3和4,不交換)
2 3 1 4 (比較4和1,交換)
第一輪結(jié)束,最大的數(shù)字 4 已經(jīng)在最后面,因此第二輪排序只需要對前面三個數(shù)進行比較。
第二輪 排序過程
2 3 1 4 (第一輪排序結(jié)果)
2 3 1 4 (比較2和3,不交換)
2 1 3 4 (比較3和1,交換)
第二輪結(jié)束,次大的數(shù)字 3 已經(jīng)排在倒數(shù)第二個位置,所以第三輪只需要比較前兩個元素。
第三輪 排序過程
2 1 3 4 (第二輪排序結(jié)果)
1 2 3 4 (比較2和1,交換)
至此,排序結(jié)束。
算法總結(jié)及實現(xiàn)
對擁有 n 個元素的數(shù)組 R[n] 進行 n-1 輪比較。
第一輪,逐個比較 (R[1], R[2]), (R[2], R[3]), (R[3], R[4]), ……. (R[N-1], R[N]),最大的元素被移動到 R[n] 上。
第二輪,逐個比較 (R[1], R[2]), (R[2], R[3]), (R[3], R[4]), ……. (R[N-2], R[N-1]),次大的元素被移動到 R[n-1] 上。
以此類推,直到整個數(shù)組從小到大排序。
具體的代碼實現(xiàn)如下所示:
#include<stdio.h>
intmain(){
int nums[10]={4,5,2,10,7,1,8,3,6,9};
int i, j, temp;
//冒泡排序算法:進行 n-1 輪比較
for(i=0; i<10-1; i++){
//每一輪比較前 n-1-i 個,也就是說,已經(jīng)排序好的最后 i 個不用比較
for(j=0; j<10-1-i; j++){
if(nums[j]> nums[j+1]){
temp = nums[j];
nums[j]= nums[j+1];
nums[j+1]= temp;
}
}
}
//輸出排序后的數(shù)組
for(i=0; i<10; i++){
printf("%d ", nums[i]);
}
printf("\n");
return0;
}
運行結(jié)果:
1 2 3 4 5 6 7 8 9 10
優(yōu)化算法
上面的算法是大部分教材中提供的算法,其中有一點是可以優(yōu)化的:當(dāng)比較到第 i 輪的時候,如果剩下的元素已經(jīng)排序好了,那么就不用再繼續(xù)比較了,跳出循環(huán)即可,這樣就減少了比較的次數(shù),提高了執(zhí)行效率。
未經(jīng)優(yōu)化的算法一定會進行 n-1 輪比較,經(jīng)過優(yōu)化的算法最多進行 n-1 輪比較,高下立判。
優(yōu)化后的算法實現(xiàn)如下所示:
#include<stdio.h>
intmain(){
int nums[10]={4,5,2,10,7,1,8,3,6,9};
int i, j, temp, isSorted;
//優(yōu)化算法:最多進行 n-1 輪比較
for(i=0; i<10-1; i++){
isSorted =1;//假設(shè)剩下的元素已經(jīng)排序好了
for(j=0; j<10-1-i; j++){
if(nums[j]> nums[j+1]){
temp = nums[j];
nums[j]= nums[j+1];
nums[j+1]= temp;
isSorted =0;//一旦需要交換數(shù)組元素,就說明剩下的元素沒有排序好
}
}
if(isSorted)break;//如果沒有發(fā)生交換,說明剩下的元素已經(jīng)排序好了
}
for(i=0; i<10; i++){
printf("%d ", nums[i]);
}
printf("\n");
return0;
}
我們額外設(shè)置了一個變量 isSorted,用它作為標(biāo)志,值為“真”表示剩下的元素已經(jīng)排序好了,值為“假”表示剩下的元素還未排序好。
每一輪比較之前,我們預(yù)先假設(shè)剩下的元素已經(jīng)排序好了,并將 isSorted 設(shè)置為“真”,一旦在比較過程中需要交換元素,就說明假設(shè)是錯的,剩下的元素沒有排序好,于是將 isSorted 的值更改為“假”。
每一輪循環(huán)結(jié)束后,通過檢測 isSorted 的值就知道剩下的元素是否排序好。
原文鏈接:https://blog.csdn.net/Elanie1024/article/details/128755795
相關(guān)推薦
- 2022-06-21 C語言實現(xiàn)順序表的全操作詳解_C 語言
- 2022-08-22 pyecharts繪制時間輪播圖柱形圖+餅圖+玫瑰圖+折線圖_python
- 2022-10-24 React中父子組件通信詳解_React
- 2022-09-20 Python?flask使用ajax上傳文件的示例代碼_python
- 2022-05-06 matplotlib繪制兩點間連線的幾種方法實現(xiàn)_python
- 2024-04-05 @Version樂觀鎖配置mybatis-plus使用(version)
- 2022-10-03 pytest文檔內(nèi)置fixture的request詳情_python
- 2022-05-20 ElasticSearch 7.X系列之:查詢分析索引磁盤使用空間_disk_usage
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支