int main(){ int a[15] = {2,3,4,5,15,19,16,27,36,38,44,46,47,48,50}; InsertSort(a,15); print(a,15,15); }
4 快速排序
算法思想:
選取第一個數為基準
將比基準小的數交換到前面,比基準大的數交換到后面
對左右區間重復第二步,直到各區間只有一個數
快速排序動圖演示
代碼:
void QuickSort(vector<int>& v, int low, int high) { if (low >= high) // 結束標志 return; int first = low; // 低位下標 int last = high; // 高位下標 int key = v[first]; // 設第一個為基準
while (first < last) { // 將比第一個小的移到前面 while (first < last && v[last] >= key) last--; if (first < last) v[first++] = v[last];
// 將比第一個大的移到后面 while (first < last && v[first] <= key) first++; if (first < last) v[last--] = v[first]; } // v[first] = key; // 前半遞歸 QuickSort(v, low, first - 1); // 后半遞歸 QuickSort(v, first + 1, high); }
#include <iostream> #include <algorithm> using namespace std;
// 堆排序:(最大堆,有序區)。從堆頂把根卸出來放在有序區之前,再恢復堆。
void max_heapify(int arr[], int start, int end) { //建立父節點指標和子節點指標 int dad = start; int son = dad * 2 + 1; while (son <= end) { //若子節點在范圍內才做比較 if (son + 1 <= end && arr[son] < arr[son + 1]) //先比較兩個子節點指標,選擇最大的 son++; if (arr[dad] > arr[son]) //如果父節點大于子節點代表調整完成,直接跳出函數 return; else { //否則交換父子內容再繼續子節點與孫節點比較 swap(arr[dad], arr[son]); dad = son; son = dad * 2 + 1; } } }
void heap_sort(int arr[], int len) { //初始化,i從最后一個父節點開始調整 for (int i = len / 2 - 1; i >= 0; i--) max_heapify(arr, i, len - 1); //先將第一個元素和已經排好的元素前一位做交換,再從新調整(剛調整的元素之前的元素),直到排序完成 for (int i = len - 1; i > 0; i--) { swap(arr[0], arr[i]); max_heapify(arr, 0, i - 1); } }
int main() { int arr[] = { 3, 5, 3, 0, 8, 6, 1, 5, 8, 6, 2, 4, 9, 4, 7, 0, 1, 8, 9, 7, 3, 1, 2, 5, 9, 7, 4, 0, 2, 6 }; int len = (int) sizeof(arr) / sizeof(*arr); heap_sort(arr, len); for (int i = 0; i < len; i++) cout << arr[i] << ' '; cout << endl; return 0; }
6 歸并排序
歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為2-路歸并。算法思想:1.把長度為n的輸入序列分成兩個長度為n/2的子序列;2. 對這兩個子序列分別采用歸并排序;3. 將兩個排序好的子序列合并成一個最終的排序序列。歸并排序動圖演示
做電池供電攝像頭、可視門鈴、戶外安防的同學應該都踩過這個坑:攝像頭要拍,ISP、sensor、無線模塊全得開著,整機電流動輒幾百 mA。一節 18650 撐不了幾天,用戶投訴“怎么又沒電了”。有人會說:加個 PIR 人體紅外不就行了?問題是 PIR 怕熱、怕寵物、怕隔著亞克力/玻璃殼,而且只能感知“有溫差的人體移動”,靈敏度飄忽。真正省電的思路應該是:讓攝像頭平時徹底睡死,只有“前面有人/有動靜”時才被一鍵喚醒——而負責這個“看門”角色的,最合適的是一顆低功耗雷達。一、為什么是雷達,而不是 PI