1.氣泡排序
思路:氣泡排序只會操作相鄰的兩個資料。每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關係要求。如果不滿足就讓它倆互換。一次冒泡會讓至少乙個元素移動到它應該在的位置,重複 n 次,就完成了 n 個資料的排序工作。
func bubblesort(arr int)
flag := false
for i := 0; i < len(arr); i++
} if !flag
} return
}
2.插入排序
思路:首先,我們將陣列中的資料分為兩個區間,已排序區間和未排序區間。初始已排序區間只有乙個元素,就是陣列的第乙個元素。插入演算法的核心思想是取未排序區間中的元素,在已排序區間中找到合適的插入位置將其插入,並保證已排序區間資料一直有序。重複這個過程,直到未排序區間中元素為空,演算法結束。
func insertsort(arr int) int
for i := 1; i < len(arr); i++ else
} arr[j+1] = value
} return arr
}
3.選擇排序
思路:選擇排序演算法的實現思路有點類似插入排序,也分已排序區間和未排序區間。但是選擇排序每次會從未排序區間中找到最小的元素,將其放到已排序區間的末尾。
func selectsort(arr int)int
for i:=0; i4.快速排序
思路:如果要排序陣列是下標從 p 到 r 之間的一組資料,我們選擇 p 到 r 之間的任意乙個資料作為 pivot(分割槽點)。我們遍歷 p 到 r 之間的資料,將小於 pivot 的放到左邊,將大於 pivot 的放到右邊,將 pivot 放到中間。經過這一步驟之後,陣列 p 到 r 之間的資料就被分成了三個部分,前面 p 到 q-1 之間都是小於 pivot 的,中間是 pivot,後面的 q+1 到 r 之間是大於 pivot 的。根據分治、遞迴的處理思想,我們可以用遞迴排序下標從 p 到 q-1 之間的資料和下標從 q+1 到 r 之間的資料,直到區間縮小為 1,就說明所有的資料都有序了。
func quicksort(arrint, p, r int)
q := partitionv2(arr, p, r)
quicksort(arr, p, q-1)
quicksort(arr, q+1, r)
}func partition(arrint, p, r int) int
c := (a + b) / 2
mergesortmy(arr, a, c)
mergesortmy(arr, c, b)
leftarr := make(int, c-a)
rightarr := make(int, b-c)
copy(leftarr, arr[a:c])
copy(rightarr, arr[c:b])
leftindex, rightindex := 0, 0
for i := a; i < b; i++ else if rightindex >= b-c else if leftarr[leftindex] < rightarr[rightindex] else
} return arr
}
資料結構筆記(6)排序
基於比較的排序 前提 選擇排序 演算法 資料移動是最少的 每次交換都會改變兩個陣列元素的值,選擇排序用了n次交換。交換次數和陣列的大小是線性關係。實現 void choosesort int a,int n 交換元素 int tmp a j a j a min a min tmp 更新最小元的資訊,...
資料結構學習筆記 排序
排序 就是要整理表中的元素,使之按關鍵字遞增 或遞減 有序排列。如果待排序的表中,存在有多個關鍵字相同的元素,經過排序後這些具有相同關鍵字的元素之間的相對 次序保持不變,則稱這種 排序演算法是穩定的。在排序過程中,若整個表都是放在記憶體中處理,排序時不涉及資料的內 外存交換,則稱之為 內排序 反之,...
資料結構1 排序
就算複習再緊張,也要動手實踐資料結構中的基本演算法,徹底理解演算法的本質。不要讓任何理由成為不程式設計的藉口。從快速排序開始,將演算法問題一一攻克。複習提綱 基本資料結構 棧和佇列,陣列和鍊錶 樹和二叉樹 二叉查詢樹 平衡二叉樹 雜湊表 排序演算法 選擇排序 氣泡排序和快速排序 堆和堆排序 計數排序...