排序演算法是最基本最常用的演算法,不同的排序演算法在不同的場景或應用中會有不同的表現,我們需要對各種排序演算法熟練才能將它們應用到實際當中,才能更好地發揮它們的優勢。今天,來總結下各種排序演算法。
下面這個**總結了各種排序演算法的複雜度與穩定性:
各種排序演算法複雜度比較.png
氣泡排序
氣泡排序可謂是最經典的排序演算法了,它是基於比較的排序演算法,時間複雜度為o(n^2),其優點是實現簡單,n較小時效能較好。
void bubble_sort(int arr, int len) } }}
選擇排序
void select_sort(int arr, int len) if (index != i) }}
插入排序
void insert_sort(int arr, int len) arr[j + 1] = k; }}
快速排序
void quick_sort(int arr, int left, int right) arr[i] = target; quick_sort(arr, left, i - 1); quick_sort(arr, i + 1, right); }}
歸併排序
void merge(int arr, int temp_arr, int start_index, int mid_index, int end_index) while (i < mid_index + 1) while (j < end_index + 1) temp_arr[k++] = arr[j++]; for (i = 0, j = start_index; j < end_index + 1; i ++, j ++) arr[j] = temp_arr[i];}void merge_sort(int arr, int temp_arr, int start_index, int end_index)}
堆排序
二叉堆二叉堆是完全二叉樹或者近似完全二叉樹,滿足兩個特性
當父結點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆。當父結點的鍵值總是小於或等於任何乙個子節點的鍵值時為最小堆。一般二叉樹簡稱為堆。
堆的儲存
一般都是陣列來儲存堆,i結點的父結點下標就為(i – 1) / 2。它的左右子結點下標分別為2 * i + 1和2 * i + 2。如第0個結點左右子結點下標分別為1和2。儲存結構如圖所示:
堆結構.png
堆排序原理
堆排序的時間複雜度為o(nlogn)
/** * 將陣列arr構建大根堆 * @param arr 待調整的陣列 * @param i 待調整的陣列元素的下標 * @param len 陣列的長度 */void heap_adjust(int arr, int i, int len) else break; }}/** * 堆排序演算法 */void heap_sort(int arr, int len) for (i = len - 1; i > 0; i--) }
php陣列進行打亂,重新排列
最近做專案遇到這樣乙個問題,是關於乙個考試的專案 要求a b c d的答案不能始終在一樣的位置,所以就要進行重新組裝隨機出來了。黏上 header content type text html charset utf 8 array choice 直角三角形 銳角三角形 鈍角三角形 天角三角形 fu...
重新排列陣列 1470
題目 給你乙個陣列 nums 陣列中有 2n 個元素,按 x1,x2,xn,y1,y2,yn 的格式排列。請你將陣列按 x1,y1,x2,y2,xn,yn 格式重新排列,返回重排後的陣列。示例 1 輸入 nums 2,5,1,3,4,7 n 3 輸出 2,3,5,4,1,7 解釋 由於 x1 2,x...
1470 重新排列陣列
1470.重新排列陣列 給你乙個陣列 nums 陣列中有 2n 個元素,按 x1,x2,xn,y1,y2,yn 的格式排列。請你將陣列按 x1,y1,x2,y2,xn,yn 格式重新排列,返回重排後的陣列。示例 1 輸入 nums 2,5,1,3,4,7 n 3 輸出 2,3,5,4,1,7 解釋 ...