網站首頁 編程語言 正文
冒泡排序法
類似旗袍上涌的動作,會將數據在數組中從小大大或者從大到小不斷的向前移動。
基本思想:
冒泡排序的基本思想是對比相鄰的兩個元素值,如果滿足條件就交換元素值,把較小的元素移動到數組前面,把大的元素移動到數組后面(也就是交換兩個元素的位置),這樣較小的元素就像氣泡一樣從底部上升到頂部。
算法思路
冒泡算法由雙層循環實現,其中外部循環用于控制排序輪數,一般為要排序的數組長度減1次,因為最后一次循環只剩下一個數組元素,不需要對比,同時數組已經完成排序了。而內部循環主要用于對比數組中每個相鄰元素的大小,以確定是否交換位置,對比和交換次數隨排序輪數而減少。
#!/bin/bash array=(112 221 33 55 66 11 25 68) length="${#array[@]}" for ((i=1; i<=$length; i++)) do for ((j=1; j<=$length-$i; j++)) do first=${array[$j]} k=$[$j+1] second=${array[$k]} if [ $first -gt $second ] then temp=$first array[$j]=$second array[$k]=$temp fi done done echo "new_array: ${array[@]}"
直接選擇排序
與冒泡排序相比,直接選擇排序的交換次數更少,所以速度會快些。
基本思想:
將指定排序位置與其它數組元素分別對比,如果滿足條件就交換元素值,注意這里區別冒泡排序,不是交換相鄰元素,而是把滿足條件的元素與指定的排序位置交換(如從最后一個元素開始排序),這樣排序好的位置逐漸擴大,最后整個數組都成為已排序好的格式。
#!/bin/bash array=(77 22 99 1 23 55 11) echo "老數組順序為 ${array[@]}" length=${#array[@]} for ((i=1; i<=length; i++)) do index=0 for ((j=1; j<=length-i; j++)) do CURR=${array[$j]} MAX=${array[$index]} if [ $CURR -gt $MAX ] then index=$j fi done last=$[ $length - $i ] temp=${array[$last]} array[$last]=${array[$index]} array[$index]=$temp done echo "新數組的順序為 ${array[@]}"
反轉排序
以相反的順序把原有數組的內容重新排序。
基本思想:
把數組最后一個元素與第一個元素替換,倒數第二個元素與第二個元素替換,以此類推,直到把所有數組元素反轉替換。
#!/bin/bash array=(1 2 3 4 5 6 7 8 9) length=${#array[@]} for ((i=0; i<=length/2; i++)) do first=${array[$i]} last=${array[$length-$i-1]} temp=$first array[$i]=$last array[$length-$i-1]=$temp done echo "${array[*]}"
直接插入算法
插入排序,又叫直接插入排序。實際中,我們玩撲克牌的時候,就用了插入排序的思想。
基本思想:
在待排序的元素中,假設前n-1個元素已有序,現將第n個元素插入到前面已經排好的序列中,使得前n個元素有序。按照此法對所有元素進行插入,直到整個序列有序。
#!/bin/bash array=(8 2 9 44 6 28 10) echo "原數組為 ${array[*]}" length=${#array[@]} for ((i=1; i<=$length; i++)) do for ((j=0; j<=$i; j++)) do if [[ ${array[$i]} -lt ${array[$j]} ]] then temp=${array[$i]} array[$i]=${array[$j]} array[$j]=$temp fi done done echo "新數組為 ${array[@]}" ~ ~
希爾算法
希爾排序也是一種插入排序,它是簡單插入排序經過改進之后的一個更高效的版本,也稱為縮小增量排序 。
基本思想
希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分成一組,算法便終止。
1.先選定一個小于N的整數gap作為第一增量,然后將所有距離為gap的元素分在同一組,并對每一組的元素進行直接插入排序。然后再取一個比第一增量小的整數作為第二增量,重復上述操作…
2.當增量的大小減到1時,就相當于整個序列被分到一組,進行一次直接插入排序,排序完成。
gap越大,數據挪動得越快;gap越小,數據挪動得越慢。前期讓gap較大,可以讓數據更快得移動到自己對應的位置附近,減少挪動次數。
#!/bin/bash array=(8 9 1 7 2 3 5 4) length=${#array[@]} echo "原數組為 ${array[@]}" #設長度的一半為gap初始間隔,每次循環gap都除以2,直至gap為1結束循環 for ((gap=$length/2; gap>0; gap/=2)) do #因為gap為整個長度的一半,所以gap到length結尾包含的元素數剛好為需要進行直接插入算法的個數 for ((i=gap; i<$length; i++)) do #設一個第三變量方便直接插入進行交換 temp=${array[$i]} #對距離為gap的元素組進行排序,每一輪比較拿當前輪次最后一個元素與組內其他元素比較,將數組大的往后放 for((j=i-gap; j>=0&&temp<${array[$j]}; j-=gap)) do array[$j+$gap]=${array[$j]} done array[$j+$gap]=$temp done done echo "新的數組為 ${array[*]}"
原文鏈接:https://blog.csdn.net/weixin_44938203/article/details/122108491
相關推薦
- 2023-03-13 Pandas數據分析常用函數的使用_python
- 2022-06-01 C語言?詳解如何刪除有序數組中的重復項_C 語言
- 2022-11-06 Matplotlib學習筆記之plt.xticks()用法_python
- 2022-12-23 python類中的self和變量用法及說明_python
- 2022-06-24 C#中緩存System.Web.Caching用法總結_C#教程
- 2022-05-05 Flutter如何保證數據操作原子性詳解_Android
- 2022-05-17 Spring Cloud Ribbon詳解
- 2022-07-23 .Net創建型設計模式之簡單工廠模式(Simple?Factory)_基礎應用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支