網(wǎng)站首頁 編程語言 正文
前言
現(xiàn)在的面試真的是越來越卷了,算法已經(jīng)成為了面試過程中必不可少的一個(gè)環(huán)節(jié),你如果想進(jìn)稍微好一點(diǎn)的公司,「算法是必不可少的一個(gè)環(huán)節(jié)」。那么如何學(xué)習(xí)算法呢?很多同學(xué)的第一反應(yīng)肯定是去letcode上刷題,首先我并不反對(duì)刷題的方式,但是對(duì)于一個(gè)沒有專門學(xué)習(xí)過算法的同學(xué)來說,刷題大部分是沒什么思路的,花一個(gè)多小時(shí)暴力破解一道題意義也不大,事后看看別人比較好的解法大概率也記不住,所以我覺得「專門針對(duì)算法進(jìn)行一些簡(jiǎn)單的訓(xùn)練」是很有必要的,正好我自己最近也在學(xué)習(xí),同時(shí)把學(xué)習(xí)成果同步更新在公眾號(hào)上,可能會(huì)更很多期,希望能幫助到你。另外最近很多同學(xué)也都在學(xué)習(xí)go,所以我就用go代碼演示算法。今天咱們閑話不用多說,就從最簡(jiǎn)單的開始。
五種基礎(chǔ)排序算法對(duì)比
五種基礎(chǔ)排序算法對(duì)比
1、冒泡排序
算法描述
- 比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換它們兩個(gè)。
- 對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì),這樣在最后的元素應(yīng)該會(huì)是最大的數(shù)。
- 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。
- 重復(fù)步驟1~3,直到排序完成。
代碼演示
func bubbleSort(arr []int) []int { if len(arr) <= 1 { return arr } for e := len(arr) - 1; e > 0; e-- { for i := 0; i < e; i++ { if arr[i] > arr[i+1] { Swap(arr, i, i+1) //交換元素 } } } return arr } func Swap(arr []int, i, j int) []int { temp := arr[j] arr[j] = arr[i] arr[i] = temp return arr }
2、選擇排序
算法描述
n個(gè)記錄的直接選擇排序可經(jīng)過n-1趟直接選擇排序得到有序結(jié)果。具體算法描述如下:
- 將假想墻放置在數(shù)字列表最左側(cè),墻的左側(cè)為已排序子列表,右側(cè)為未排序子列表。
- 找出(選擇)未排序子列表中的最小(或最大)元素。
- 把選擇的元素與未排序列表中第一個(gè)元素進(jìn)行交換。
- 將假想墻向右移動(dòng)一個(gè)位置。
- 反復(fù)執(zhí)行 2 至 4 步操作,直至整個(gè)數(shù)字列表排序完成(需要 n - 1 輪)。
代碼演示
func selectSort(arr []int) []int { if len(arr) <= 1 { return arr } for i := 0; i < len(arr); i++ { var minIndex int = i for j := i + 1; j < len(arr); j++ { if arr[j] < arr[minIndex] { minIndex = j } } arr = Swap(arr, i, minIndex) } return arr } func Swap(arr []int, i, j int) []int { temp := arr[j] arr[j] = arr[i] arr[i] = temp return arr }
3、插入排序
算法描述
一般來說,插入排序都采用in-place在數(shù)組上實(shí)現(xiàn)。具體算法描述如下:
- 從第一個(gè)元素開始,該元素可以認(rèn)為已經(jīng)被排序。
- 取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描。
- 如果該元素(已排序)大于新元素,將該元素移到下一位置。
- 重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置;將新元素插入到該位置后;
- 重復(fù)步驟2~5。
代碼實(shí)現(xiàn)
func insertSort(arr []int) []int { if len(arr) <= 1 { return arr } for i := 1; i < len(arr); i++ { for j := i - 1; j >= 0; j-- { if arr[j] > arr[j+1] { Swap(arr, j, j+1) } } } return arr } func Swap(arr []int, i, j int) []int { temp := arr[j] arr[j] = arr[i] arr[i] = temp return arr }
4、快速排序
算法描述
快速排序的基本思想:通過一趟排序?qū)⒋庞涗浄指舫瑟?dú)立的兩部分,其中一部分記錄的關(guān)鍵字均比另一部分的關(guān)鍵字小,則可分別對(duì)這兩部分記錄繼續(xù)進(jìn)行排序,以達(dá)到整個(gè)序列有序。
- 從數(shù)列中挑出一個(gè)元素,稱為 “基準(zhǔn)”(pivot)。
- 重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱為分區(qū)(partition)操作。
- 遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。
代碼實(shí)現(xiàn)
//快速排序 func quickSort(arr []int) []int { if len(arr) <= 1 { return arr } middle := arr[0] var left []int var right []int for i := 1; i < len(arr); i++ { if arr[i] > middle { right = append(right, arr[i]) } else { left = append(left, arr[i]) } } middle_s := []int{middle} left = quickSort(left) right = quickSort(right) arr = append(append(left, middle_s...), right...) return arr }
原文鏈接:https://developer.51cto.com/article/709199.html
相關(guān)推薦
- 2022-03-30 帶你了解Python妙開根號(hào)的三種方式_python
- 2022-11-23 Qt采用線程以隊(duì)列方式實(shí)現(xiàn)下發(fā)數(shù)據(jù)_C 語言
- 2022-01-19 webpack5 熱更新無響應(yīng)
- 2022-07-16 關(guān)于報(bào)錯(cuò) Error starting ApplicationContext. To display
- 2022-10-27 Python數(shù)值求解微分方程方法(歐拉法,隱式歐拉)_python
- 2022-04-11 nginx從安裝到配置詳細(xì)說明(安裝,安全配置,防盜鏈,動(dòng)靜分離,配置?HTTPS,性能優(yōu)化)_ng
- 2022-04-07 Kotlin原理詳析之拓展函數(shù)_Android
- 2022-04-12 安裝zsh&oh-my-zsh(沒有root權(quán)限)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支