for (int i = 0; i < N; i++) { int flag = i; for (int j = i; j < N; j++) { if (vec[j] > vec[flag]) { flag = j; } } int temp = vec[flag]; vec[flag] = vec[i]; vec[i] = temp; }
1.3 插入排序
从第一个元素开始,该元素可以认为已经被排序;
在已经排序的元素序列中从后向前扫描;
如果该元素(已排序)大于新元素,将该元素移到下一位置;
img
1 2 3 4 5 6 7 8 9
for (int i = 1; i < N; i++) { int current_i = i; int count = vec[i]; while (current_i > 0 && count < vec[current_i - 1]) { vec[current_i] = vec[current_i - 1]; current_i--; } vec[current_i] = count; }
1.4 希尔排序(Shell Sort)
直接插入排序算法的一种更高效的改进版本
把无序数组通过分组,分组之间比较进行移动,最后形成一个有序数组
在这里插入图片描述
1 2 3 4 5 6 7 8 9 10 11 12 13 14
for (int gap = N / 2; gap > 0; gap /= 2) {//为1的时候就不需要继续排序了 for (int i = 0; i < gap; i++) { //以下可以看作插入排序的实现 for (int j = i; j < N; j += gap) { int count = vec[j]; int current_j = j; while (current_j - gap >= 0 && count > vec[current_j-gap]) { vec[current_j] = vec[current_j - gap]; current_j -= gap; } vec[current_j] = count; } } }
voidQuickSort(vector<int> &arr, int left, int right) { if (left >= right)return; int key = arr[left]; int begin = left; int end = right; int flag = left; while (begin < end) { while (begin < end && arr[end] >= key) { end--; } arr[flag] = arr[end]; flag = end; while (begin < end && arr[begin] <= key) { begin++; } arr[flag] = arr[begin]; flag = begin; } arr[flag] = key; QuickSort(arr, left, flag - 1); QuickSort(arr, flag + 1, right); }
voidQuickSort(vector<int>& arr, int left, int right){ if (left >= right) return; int begin = left; int end = right; int key = arr[left]; while (begin < end) {
while (begin < end && arr[end] >= key) { end--; } while (begin < end && arr[begin] <= key) { begin++; } swap(arr[begin], arr[end]); } swap(arr[left], arr[begin]); QuickSort01(arr, left, begin - 1); QuickSort01(arr, begin + 1, right); }
2 快速幂与快速乘
\[
计算3^5\\
(5)_H=(101)_2\\
3^5 = 3^4*3^1
\]
1 2 3 4 5 6 7 8 9 10
intqpow(int a, int n){ int ans = 1; while(n){ if(n&1) //如果n的当前末位为1 ans *= a; //ans乘上当前的a a *= a; //a自乘 n >>= 1; //n往右移一位 } return ans; }
取模运算规则:
1 2 3 4
(a + b) % p = (a % p + b % p)%p (a - b) % p = (a % p - b % p)%p (a * b) % p = ((a % p) * (b % p))%p (a ^ b) % p = ((a % p)^b) %p
\[
计算3^{15}\%7
\]
1 2 3 4 5 6 7 8 9
intqpow(int a, int n){ int ans = 1; while(n){ if(n&1) ans = (ans * a)%7; a = (a * a)%7; n>>=1; } return ans; }
同理,快速乘有类似的算法
1 2 3 4 5 6 7 8 9 10 11
intqcg(int a, int b, int p) { int res = 0; while (b) { if (b & 1)res = ((LL)res + a) % p; a = ((LL)a + a) % p; b >>= 1; } return res; }
#include<iostream> usingnamespace std; int m, n, x, y, nx, ny, sum = 1; int cx[4] = { 0,0,1,-1 }; int cy[4] = { 1,-1,0,0 }; char ma[23][23]; int mo[23][23]; voiddfs(int sx, int sy) { for (int i = 0; i < 4; i++) { nx = sx + cx[i]; ny = sy + cy[i]; if (nx >= 0 && nx <= m && ny >= 0 && ny <= n && mo[nx][ny] == 0 && ma[nx][ny] == '.') { sum++; mo[nx][ny] = 1; dfs(nx, ny); mo[nx][ny] = 0; } } } intmain() { cin >> n >> m; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cin >> ma[i][j]; if (ma[i][j] == '@') { x = i; y = j; } } } dfs(x, y);