發(fā)布時(shí)間:2026-05-05 10:57:33 瀏覽:213 次
快速排序(Quick Sort)是一種高效的排序算法,其基本思想是和歸通過(guò)一趟排序將(′_`)待排序的數據分割成獨立的兩部分,其中一部分的并排比較所有數據都比另一部分的所有數據要小,然后再按此方法對這兩部分數據分別進(jìn)行快速排序,實(shí)現算法整個(gè)排序過(guò)程可以遞歸ヽ(′▽?zhuān)?ノ進(jìn)行(╬ ò﹏ó),快速以此達到整個(gè)數據變成(cheng)有序序列。排序
歸并排序(Merge Sort)是和歸一種分治法(Divide and Conquer)的排序算法,它的并排比較基本思想是將待排序的數據分為兩個(gè)子序列,對子序列分別進(jìn)行排序,實(shí)現算法然后將已排序的快速子序列合并成一個(gè)有序序列,歸并排序的排序時(shí)間復雜度為O(nlogn),是一種非常高效( ?ω?)的排序算法。
快速排序??實(shí)現
1、定義一個(gè)快速排序的函數quickSort,接收一個(gè)整數切片arr和兩個(gè)整數le??ft和right作為參數,表示需要(yao)排序的范圍。
func quickSort(arr []int, left, right int) { }2、在quickSort函數中,首先判斷left是否小于right,如果滿(mǎn)足條件,則執行以下操作:
選取基準值pivot,這??里我們選擇數組的第一個(gè)元素作為基(ji)準值。
通過(guò)遍歷數組,將小于基準值的元素放到左邊,大于基準值的元素放到右邊。
對左右兩邊的子數組分別遞歸??調用quickSort函數。
if left < right { p := partition(arr, left, right) quickSort(arr, left, p-1) quickSort(arr, p+1, right)}3、實(shí)現partition函數,用于將數組劃分為兩部分,該函數接收一個(gè)整數切片arr和兩個(gè)整數left和right作為參數,返回一個(gè)整數p,表示劃分的位置。
func partit??ion(arr []int, left,?? right int) in??t { pivot := arr[left] // 基準值為第一個(gè)元素 i := left + 1 // i指向小于基準值的元素的第一個(gè)位置 j := ri??ght // j指向大于基準值的元素的最后一個(gè)位置 for k := left; k <= j; k++ { if arr[k] < pivot { arr[i], arr[k] = arr[k], arr[i] // 將小于基準值的元素放到??左邊 i++ // i指針后移一??位 } else if arr[k] > pivot { arr[j], arr[k] = arr(???)[k], arr[j] // 將大于基準值的元素( ?ω?)放到右邊 j-// j指針前移一位 } } arr[i], arr[right] = arr[right], arr[i] // 將基準值放到正確的位置┐(′ー`)┌ return i // 返回劃分的位置}歸并排序實(shí)現(/ω\)
1、實(shí)現一個(gè)歸并排序的函數mergeSort,接收一個(gè)整數切片arr作為參數,在函數內部,首先判斷數組長(cháng)度是否小于等于1,如果是,則直接返回,(′?`)否則,將數組分成兩半,分別對左右兩半進(jìn)行遞歸調用mergeSort函數,將兩個(gè)已排序的子數組合并成一個(gè)有序數組。
func mergeSort(arr []int) []int { if len(arr) <= 1 { return arr } mid := len(arr) / 2 // 計算中間位置 left := mergeSor(′_ゝ`)t(ar?r[:mi(′?_?`)d]) // 對左半部分進(jìn)行遞歸排序 right := mergeSort(arr[mid:]) // 對右半部分進(jìn)行遞歸排序 return merge(left, right) // 將兩個(gè)已排序的子數組合并成一個(gè)有序數組}2、實(shí)現merge函數,用于將兩個(gè)已排序的子數組合并成一個(gè)有序數組,該函數接收兩個(gè)整數切片(?Д?)left和right作為參數,返回一個(gè)整數切片,在函數內(nei)部,使用雙指針?lè )ū闅v兩(liang)個(gè)子數組,將較小的元素放到結果數組中,直到遍歷完兩個(gè)子數組。
func(⊙_⊙) merge(left, right []int) []int { res := make([]int, len??(left)+len(right)) // 創(chuàng )建一個(gè)足夠大的結果數組 i := 0 //?? i指向結果數組的第一個(gè)位置 j := 0 // j指向第二個(gè)子數組的第一個(gè)位置 k := 0 // k指向結果數組的第一個(gè)位置加1(即原(′?_?`)數組的第一個(gè)位置) for i < len(left) && j < len(right) { // 當兩個(gè)子數組都沒(méi)(′?`)有遍歷完時(shí),繼續循環(huán) if left[i] < right[j] { // 如果左半部分的元素小于右半部分(fen)的元素,將其放入結果數組中 res[k] = left[i] i++ // i指針后移一位 } else if left[i] > right[j] { // 如果左半部分的元素大于右半部分的元素,將其放入結果數組中 res[k] = right[j] j++ // j指針后移一位 } elヽ(′?`)ノse { //ヽ(′ー`)ノ 如果左半部分的元素等于右半部分的元素,跳過(guò)這兩個(gè)元素,繼續比較下一個(gè)元素 i++ // i指針后移一位 j++ // j指針后移(╥_╥)一位 } k++ // k指針后移一位(即原數組的第一個(gè)位置加1) } for i < len(left) { // 當左半部分還有剩余元素時(shí),將其放入結果數組中 res[k] = left[i] i++ // i指針后移一位 k++ // k指針后移一位(即原數組的第一個(gè)位置加1) } for j < len(right) { // 當右半部分還有剩余元素時(shí),將其放入結果數組中(此時(shí)左半部分已經(jīng)全部放入結果數組) res[k] = right[j] j++ // j指針后移一位 k++ // k指針后移一位(即原數組的第一個(gè)位置加1) } return res // 返回合并后的有序數組}

您的當前位置: