【數據結構】 排序算法

【數據結構】 排序算法

  • 一、排序
    • 1.1 排序是什么?
    • 1.2 排序的應用
    • 1.3 常見排序算法
  • 二、常見排序算法的實現
    • 2.1 插入排序
      • 2.1.1 直接插入排序
      • 2.1.2 希爾排序
    • 2.2 選擇排序
      • 2.2.1 直接選擇排序
        • 2.2.1.1 方法1
        • 2.2.1.1 方法2
      • 2.2.2 堆排序(數組形式)
    • 2.3 交換排序
      • 2.3.1 冒泡排序
      • 2.3.2 快速排序
        • 2.3.2.1 Hoare版 快速排序
        • 2.3.2.2 挖坑法 快速排序
      • 2.3.3 快排的優化
      • 2.3.4 快速排序非遞歸
    • 2.4 歸并排序
  • 三、各排序算法的復雜度及穩定性
  • 四、 其他排序
    • 4.1 計數排序
    • 4.2 基數排序
    • 4.3 桶排序

一、排序

1.1 排序是什么?

在這里插入圖片描述

1.2 排序的應用

在這里插入圖片描述

1.3 常見排序算法

在這里插入圖片描述

二、常見排序算法的實現

十大經典排序算法 動畫演示

2.1 插入排序

2.1.1 直接插入排序

(1)圖解

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

(2)直接插入排序 解題思路
在這里插入圖片描述

(3)Java 代碼實現

public class Sort {/*** 直接插入排序* 時間復雜度: 最壞情況 O(N^2)  最好情況O(N) -- 數據有序的情況下* 直接插入排序使用場景: 給定的數據 趨于有序時,可以使用直接插入排序。* 穩定性: 穩定* @param array*/public static void insertSort(int[] array){for (int i = 1; i < array.length; i++) {//從第2個元素開始排序int tmp = array[i];int j = i-1;for (; j >= 0 ; j--) {if(array[j] > tmp){array[j+1] = array[j];}else{//array[j+1] = tmp;break;}}//j=-1,把tmp的值再放回來array[j+1] = tmp;}}
}

測試類:

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Random;public class Test {//測試 直接排序法的時間效率//構造 有序數組public static void order(int[] array) {for (int i = 0; i < array.length; i++) {array[i] = i;}}//構造 逆序數組public static void  reverseOrder(int[] array){for (int i = 0; i < array.length; i++) {array[i] = array.length -i;}}//構造 隨機數組public static void randomOrder(int[] array){Random random = new Random();for (int i = 0; i < array.length; i++) {array[i] = random.nextInt(array.length);}}public static void testInsertSort(int[] array){array = Arrays.copyOf(array,array.length);long startTime = System.currentTimeMillis();Sort.insertSort(array);long endTime = System.currentTimeMillis();System.out.println("直接插入排序耗時:"+(endTime-startTime));}public static void testShellSort(int[] array){array = Arrays.copyOf(array,array.length);long startTime = System.currentTimeMillis();Sort.insertSort(array);long endTime = System.currentTimeMillis();System.out.println("假設 希爾排序耗時:"+(endTime-startTime));}public static void main(String[] args) {int[] array = new int[1_0000];reverseOrder(array);testInsertSort(array);testShellSort(array);}public static void main1(String[] args) {int[] array = {81,12,31,4,15,6};Sort.insertSort(array);System.out.println(Arrays.toString(array));//[4, 6, 12, 15, 31, 81]}
}

2.1.2 希爾排序

(1)希爾排序法的基本思想:

先選定?個整數,把待排序?件中所有記錄分成多個組,所有距離為的記錄分在同?組內,并對每?組內的記錄進?排序。然后,取,重復上述分組和排序的?作。當到達=1時,所有記錄在統?組內排好序。

(2)圖解
在這里插入圖片描述
在這里插入圖片描述
(3)Java 代碼實現

/*** 希爾排序* 時間復雜度:O(n^1.3)* 空間復雜度:O(1)* 穩定性:不穩定* @param array*/public static void shellSort(int[] array){int gap = array.length / 2;while(gap > 0){shell(array,gap);gap /= 2;}shell(array,1);}public static void shell(int[] array,int gap){for (int i = gap; i < array.length; i++) {//從第2個元素開始排序int tmp = array[i];int j = i-gap;for (; j >= 0 ; j -= gap) {if(array[j] > tmp){array[j+gap] = array[j];}else{break;}}array[j+gap] = tmp;}}

2.2 選擇排序

2.2.1 直接選擇排序

2.2.1.1 方法1

(1)圖解

在這里插入圖片描述

在這里插入圖片描述
(2)直接排序解題思路

在這里插入圖片描述
(3)Java 代碼實現

/*** 直接選擇排序* 時間復雜度:O(N^2)* 空間復雜度:O(1)* 穩定性:不穩定*/public static void selectSort(int[] array){for (int i = 0; i < array.length; i++) {int minIndex = i;for (int j = i+1; j < array.length; j++) {if(array[minIndex] > array[j]){minIndex = j;}}swap(array,minIndex,i);}}private static void swap(int[] array,int i,int j){int tmp = array[i];array[i] = array[j];array[j] = tmp;}

測試類:

 public static void main(String[] args) {int[] array = {81,12,31,4,15,6};Sort.selectSort(array);System.out.println(Arrays.toString(array));//[4, 6, 12, 15, 31, 81]}
2.2.1.1 方法2

(1)圖解
在這里插入圖片描述

在這里插入圖片描述
(2)Java 代碼

 //選擇排序 方法2/*** 每次找到2個數據 一個最大 一個最小*/public static void selectSort2(int[] array){int left = 0;int right = array.length-1;while(left < right){int minIndex = left;int maxIndex = left;for (int i = left+1; i <= right ; i++) {if(array[i] < array[minIndex]){minIndex = i;}if(array[i] > array[maxIndex]){maxIndex = i;}}swap(array,minIndex,left);//假設第一個值 是最大值 81 3 6 2 4if(left == maxIndex){maxIndex = minIndex;}swap(array,maxIndex,right);left++;right--;}}
}

2.2.2 堆排序(數組形式)

(1)圖解
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
(2)Java 代碼

//堆排序/*** 時間復雜度:O(n*log2n)* 空間復雜度:O(1)* 穩定性:不穩定*/public static void heapSort(int[] array){createHeap(array);int end = array.length -1;while(end > 0){swap(array,0,end);siftDown(array,0,end);end--;}}public static void createHeap(int[] array){for (int parent = (array.length-1-1)/2; parent >= 0 ; parent--) {siftDown(array,parent,array.length);}}public static void siftDown(int[] array,int parent,int length){int child = 2 * parent + 1;while(child < length){if(child+1 < length && array[child] < array[child+1]){//存在右孩子 并且 左孩子比右孩子小child++;}if(array[child] > array[parent]){swap(array,child,parent);parent = child;child = 2 * parent + 1;}else{break;}}}

2.3 交換排序

2.3.1 冒泡排序

    //冒泡排序/**當前代碼是優化過的版本,分析時間復雜度的時候,不考慮優化情況* 時間復雜度:O(n^2);  如果考慮優化,最好情況下時間復雜度為O(n)* 空間復雜度:O(1)* 穩定性:穩定*/public static void bubbleSort(int[] array){//趟數:10個數據 比較9趟for (int i = 0; i < array.length-1; i++) {boolean flg = false;//未優化的版本:沒有flg//每一趟的比較次數for (int j = 0; j < array.length-1-i; j++) {//未優化的版本:j < array.length-1if(array[j] > array[j+1]){swap(array,j,j+1);flg = true;}}if(!flg){break;}}}

2.3.2 快速排序

2.3.2.1 Hoare版 快速排序

(1)圖解

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
(2)Java 代碼實現

//Hoare版 快速排序/**時間復雜度:O((n^log2n)*                當前代碼的最壞情況下:O(N^2) 有序 或 逆序*空間復雜度: O(log2n) 最好*           O(N) 最壞* 穩定性:不穩定*/public static void quickSort(int[] array){quick(array,0,array.length-1);}public static void quick(int[] array,int start,int end){if(start >= end){return;}int par = partition(array,start,end);quick(array,start,par-1);quick(array,par+1,end);}private static int partitionHoare(int[] array,int left,int right){int i = left;int tmp = array[left];while(left < right){while(left < right && array[right] >= tmp){right--;}while(left < right && array[left] <= tmp){left++;}swap(array,left,right);}swap(array,left,i);return left;}
2.3.2.2 挖坑法 快速排序
private static int partition(int[] array,int left,int right){int tmp = array[left];while(left < right){while(left < right && array[right] >= tmp){right--;}array[left] = array[right];while(left < right && array[left] <= tmp){left++;}array[right] = array[left];}array[left] = tmp;return left;}

2.3.3 快排的優化

  1. 三數取中

三數取中優化:

 //三數取中int index = midSum(array,start,end);swap(array,start,index);int par = partition2(array,start,end);quick(array,start,par-1);quick(array,par+1,end);}public static int midSum(int[] array,int left,int right){int mid = (left+right)/2;if(array[left] < array[right]){if(array[mid] < array[left]){return left;}else if(array[mid] > array[right]){return right;}else{return mid;}}else{if(array[mid] > array[left]){return left;}else if(array[mid] < array[right]){return right;}else{return mid;}}}

快速排序:

 //Hoare版 快速排序/**時間復雜度:O((n^log2n)*                當前代碼的最壞情況下:O(N^2) 有序 或 逆序*空間復雜度: O(log2n) 最好*           O(N) 最壞* 穩定性:不穩定*/public static void quickSort(int[] array){quick(array,0,array.length-1);}public static void quick(int[] array,int start,int end){if(start >= end){return;}//三數取中int index = midSum(array,start,end);swap(array,start,index);int par = partition2(array,start,end);quick(array,start,par-1);quick(array,par+1,end);}public static int midSum(int[] array,int left,int right){int mid = (left+right)/2;if(array[left] < array[right]){if(array[mid] < array[left]){return left;}else if(array[mid] > array[right]){return right;}else{return mid;}}else{if(array[mid] > array[left]){return left;}else if(array[mid] < array[right]){return right;}else{return mid;}}}private static int partitionHoare(int[] array,int left,int right){int i = left;int tmp = array[left];while(left < right){while(left < right && array[right] >= tmp){right--;}while(left < right && array[left] <= tmp){left++;}swap(array,left,right);}swap(array,left,i);return left;}//挖坑法 快速排序private static int partition2(int[] array,int left,int right){int tmp = array[left];while(left < right){while(left < right && array[right] >= tmp){right--;}array[left] = array[right];while(left < right && array[left] <= tmp){left++;}array[right] = array[left];}array[left] = tmp;return left;}
  1. 遞歸到小的子區間時,可以考慮使用插入排序

直接插入排序:

 public static void quick(int[] array,int start,int end){if(start >= end){return;}if(end-start+1 <= 10){//采用直接插入排序,把當前區間排序insertSortRange(array,start,end);return;}//三數取中int index = midSum(array,start,end);swap(array,start,index);int par = partition2(array,start,end);quick(array,start,par-1);quick(array,par+1,end);}public static void insertSortRange(int[] array,int left,int right){for (int i = left+1; i <= right; i++) {int tmp = array[i];int j = i-1;for (; j >= left ; j--) {if(array[j] > tmp){array[j+1] = array[j];}else{break;}}array[j+1] = tmp;}}

快速排序:

    //Hoare版 快速排序/**時間復雜度:O((n^log2n)*                當前代碼的最壞情況下:O(N^2) 有序 或 逆序*空間復雜度: O(log2n) 最好*           O(N) 最壞* 穩定性:不穩定*/public static void quickSort(int[] array){quick(array,0,array.length-1);}public static void quick(int[] array,int start,int end){if(start >= end){return;}if(end-start+1 <= 10){//采用直接插入排序,把當前區間排序insertSortRange(array,start,end);return;}//三數取中int index = midSum(array,start,end);swap(array,start,index);int par = partition2(array,start,end);quick(array,start,par-1);quick(array,par+1,end);}public static void insertSortRange(int[] array,int left,int right){for (int i = left+1; i <= right; i++) {int tmp = array[i];int j = i-1;for (; j >= left ; j--) {if(array[j] > tmp){array[j+1] = array[j];}else{break;}}array[j+1] = tmp;}}public static int midSum(int[] array,int left,int right){int mid = (left+right)/2;if(array[left] < array[right]){if(array[mid] < array[left]){return left;}else if(array[mid] > array[right]){return right;}else{return mid;}}else{if(array[mid] > array[left]){return left;}else if(array[mid] < array[right]){return right;}else{return mid;}}}private static int partitionHoare(int[] array,int left,int right){int i = left;int tmp = array[left];while(left < right){while(left < right && array[right] >= tmp){right--;}while(left < right && array[left] <= tmp){left++;}swap(array,left,right);}swap(array,left,i);return left;}//挖坑法 快速排序private static int partition2(int[] array,int left,int right){int tmp = array[left];while(left < right){while(left < right && array[right] >= tmp){right--;}array[left] = array[right];while(left < right && array[left] <= tmp){left++;}array[right] = array[left];}array[left] = tmp;return left;}
  1. 前后指針法 快速排序
//前后指針法 快速排序public static int partition(int[] array,int left,int right){int prev = left;int cur = left+1;while(cur <= right){if(array[cur] <= array[right] && array[++prev] != array[cur]){swap(array,cur,prev);}cur++;}swap(array,prev,left);return prev;

2.3.4 快速排序非遞歸

(1)圖解
在這里插入圖片描述
在這里插入圖片描述
(2)Java 代碼實現

 //非遞歸的快速排序/** 時間復雜度:O(N*logN)* 空間復雜度:O(logN)* 不穩定*/public static void quickSortNor(int[] array){int left = 0;int right = array.length -1;int par = partition2(array,left,right);Stack<Integer> stack = new Stack<>();//左邊有2個元素及以上if(par > left+1){stack.push(left);stack.push(par-1);}//右邊有2個元素及以上if(par < right-1){stack.push(par+1);stack.push(right);}//相當于把0 4 6 9扔進里面了while(!stack.isEmpty()){right = stack.pop();left = stack.pop();par = partition2(array,left,right);if(par > left+1){stack.push(left);stack.push(par-1);}//右邊有2個元素及以上if(par < right-1){stack.push(par+1);stack.push(right);}}}

2.4 歸并排序

(1)圖解
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
(2)Java 代碼實現

//歸并排序/** 時間復雜度:O(N*log2N)*  空間復雜度:O(N)*  穩定*/public static void mergeSort(int[] array){mergeSortChild(array,0,array.length-1);}private static void mergeSortChild(int[] array,int left,int right){if( left>= right){return;}int mid = (left+right) / 2;mergeSortChild(array, left, mid);mergeSortChild(array, mid + 1, right);//開始合并merge(array, left, mid, right);}private static void merge(int[] array, int left, int mid, int right) {//臨時數組int[] tmpArr = new int[right-left+1];int k = 0;//tmpArr數組下標int s1 = left;int e1 = mid;int s2 = mid+1;int e2 = right;//當2個段 都有數據的時候while(s1 <= e1 && s2 <= e2){if(array[s1] < array[s2]){tmpArr[k++] = array[s1++];}else{tmpArr[k++] = array[s2++];}}//一個段走完了 把另一個段的數據 拷貝到臨時數組while(s1 <= e1){tmpArr[k++] = array[s1++];}while(s2 <= e2){tmpArr[k++] = array[s2++];}//臨時數組當中存儲的是有序的數組 --> 拷貝數據到原始數組當中for (int i = 0; i < k; i++) {array[i+left] = tmpArr[i];}}

(3)非遞歸 歸并排序

//非遞歸 歸并排序
public static void mergeSortNor(int[] array) {if (array == null || array.length <= 1) {return;}int gap = 1; // 初始子數組長度while (gap < array.length) {// 遍歷整個數組,每次合并兩個相鄰的子數組for (int i = 0; i < array.length; i += 2 * gap) {int left = i;int mid = Math.min(i + gap - 1, array.length - 1); // 防止越界int right = Math.min(i + 2 * gap - 1, array.length - 1); // 防止越界// 合并 [left, mid] 和 [mid+1, right]merge(array, left, mid, right);}gap *= 2; // 子數組長度翻倍}}

三、各排序算法的復雜度及穩定性

在這里插入圖片描述

四、 其他排序

4.1 計數排序

(1)圖解
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
(2)java 代碼實現

//計數排序/** 使用場景:數組集中在某個范圍內*   時間復雜度:O(MAX(N,范圍))*   空間復雜度:O(范圍)*   穩定*/public static void countSort(int[] array){//1.求最大值 和 最小值int max = array[0];int min = array[0];for (int i = 1; i < array.length; i++) {if(array[i] < min){min = array[i];}if(array[i] > max){max = array[i];}}//2.定義計數數組,并求數組長度int len = max - min + 1;int[] countArray = new int[len];//3.遍歷原始數組,計數數組開始計數for (int i = 0; i < array.length; i++) {int index = array[i] - min;countArray[index]++;}//4.遍歷計數數組int k = 0;//array數組的新下標for (int i = 0; i < countArray.length; i++) {while(countArray[i] != 0){array[k] = i+min;k++;countArray[i]--;}}//執行到這里 array數組全部都有序了}

4.2 基數排序

4.3 桶排序

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87658.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87658.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87658.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NumPy-核心函數np.matmul()深入解析

NumPy-核心函數np.matmul深入解析 一、矩陣乘法的本質與np.matmul()的設計目標1. 數學定義&#xff1a;從二維到多維的擴展2. 設計目標 二、np.matmul()核心語法與參數解析函數簽名核心特性 三、多維場景下的核心運算邏輯1. 二維矩陣乘法&#xff1a;基礎用法2. 一維向量與二維…

突破政務文檔理解瓶頸:基于多模態大模型的智能解析系統詳解

重磅推薦專欄&#xff1a; 《大模型AIGC》 《課程大綱》 《知識星球》 本專欄致力于探索和討論當今最前沿的技術趨勢和應用領域&#xff0c;包括但不限于ChatGPT、DeepSeek、Stable Diffusion等。我們將深入研究大型模型的開發和應用&#xff0c;以及與之相關的人工智能生成內容…

深入探討支持向量機(SVM)在乳腺癌X光片分類中的應用及實現

?? 博主簡介:CSDN博客專家、CSDN平臺優質創作者,高級開發工程師,數學專業,10年以上C/C++, C#, Java等多種編程語言開發經驗,擁有高級工程師證書;擅長C/C++、C#等開發語言,熟悉Java常用開發技術,能熟練應用常用數據庫SQL server,Oracle,mysql,postgresql等進行開發應用…

九、K8s污點和容忍

九、K8s污點和容忍 文章目錄九、K8s污點和容忍1、污點&#xff08;Taint&#xff09;和容忍&#xff08;Toleration&#xff09;1.1 什么是污點&#xff08;Taint&#xff09;&#xff1f;1.2 什么是容忍&#xff08;Toleration&#xff09;&#xff1f;1.3 污點的影響效果&…

基于開源AI智能名片鏈動2+1模式S2B2C商城小程序的超級文化符號構建路徑研究

摘要&#xff1a;在數字技術重構文化傳播生態的背景下&#xff0c;超級文化符號的塑造已突破傳統IP運營框架。本文以開源AI智能名片鏈動21模式與S2B2C商城小程序的融合創新為切入點&#xff0c;結合"嶼光生活"體驗館、快手燒烤攤主等典型案例&#xff0c;提出"技…

QT 日志 - qInstallMessageHandler將qDebug()打印內容輸出到文件

在編程開發中&#xff0c;日志功能至關重要&#xff0c;對于在開發期間或者是程序上線后&#xff0c;都有助于排查問題&#xff1b; 對于C/C和QT方向&#xff0c;日志庫有log4cpp、plog、log4qt等&#xff0c;本篇文章將使用qt自帶的日志方式去實現。 定義日志函數&#xff1a…

記錄一下seata啟動403問題

1.現象&#xff1a;啟動報錯可能是403&#xff0c;或是是密碼錯誤一般是nacos加了認證&#xff0c;seata配置nacos賬號密碼的時候就啟動不了。可能是密碼錯誤&#xff0c;最有可能是seata版本太低導致的。1.4.2以及一下的版本應該都有這個問題2.問題密碼不能有特殊符號如&#…

【STM32實踐篇】:GPIO 詳解

文章目錄GPIO 基本結構GPIO 工作模式GPIO 基本結構 右邊的紅框是I/O引腳&#xff0c;這個I/O引腳就是我們可以看到的芯片實物的引腳&#xff0c;其他部分都是GPIO的內部結構。 保護二極管 上方二極管用于防過壓保護&#xff0c;當I/O引腳電壓高于 V_DD 二極管導通壓降?時&…

#include

關于 C 中的 include <>和 include “” 這兩種形式&#xff0c;區別其實是關于“搜索路徑”和“優先級”的。讓我詳細為你講解。 1. 簡單區別總結 #include <header>&#xff1a;告訴編譯器去“系統標準目錄”或“預定義的標準路徑”中查找頭文件&#xff08;比如…

永磁同步電機參數辨識算法--帶遺忘因子的遞推最小二乘法辨識

一、原理介紹之前已經介紹了遞推最小二乘法進行電氣參數辨識&#xff0c;在實時參數辨識中&#xff0c;協方差矩陣P和增益矩陣K是用于更新參數估計的重要工具&#xff0c;而系統參數變化時&#xff0c;P、K矩陣會逐漸減小&#xff0c;導致數據飽和。數據飽和與參數遲滯是實時參…

JVM 知識點

一、JVM 概述JVM&#xff08;Java Virtual Machine&#xff09;即 Java 虛擬機&#xff0c;它是 Java 編程語言的核心組件之一&#xff0c;負責執行 Java 程序。JVM 使得 Java 程序可以實現“一次編寫&#xff0c;到處運行”的特性&#xff0c;因為它提供了一個抽象的運行環境&…

windows裝機

1、制作啟動盤 2、制作啟動盤 啟動盤中含有WinPE系統和ISO 3、從U盤啟動&#xff0c;加載ISO 4、執行ISO中的setup安裝win10 5、之后從C盤啟動進入win10系統 6、安裝“華為電腦管家”,安裝驅動 華為電腦管家官方下載-筆記本驅動更新 | 華為官網 7、下載安裝必要軟件 https://…

提示技術系列(13)——ReAct

什么是提示技術&#xff1f; 提示技術是實現提示工程目標的具體技術手段&#xff0c;是提示工程中的“工具庫”。 什么又是提示工程&#xff1f; 提示工程是指通過設計、優化和迭代輸入到大語言模型&#xff08;LLM&#xff09;的提示&#xff08;Prompt&#xff09;&#xff…

【SVO】klt與極限搜索塊匹配findEpipolarMatchDirect

Matcher::findEpipolarMatchDirect 函數邏輯與原理分析 核心目標&#xff1a; 在極線上搜索參考幀特征點 ref_ftr 在當前幀 cur_frame 中的最佳匹配點&#xff0c;并通過三角化計算深度。 關鍵步驟解析&#xff1a; 1. 極線端點計算&#xff1a; const BearingVector A T_…

C 語言基礎入門:基本數據類型與運算符詳解

一、基本數據類型C 語言提供了豐富的基本數據類型&#xff0c;用于存儲不同類型的數據&#xff0c;主要包括整數類型、浮點類型和布爾類型。1. 整數類型整數類型用于存儲整數&#xff0c;根據是否帶符號以及占用存儲空間的不同&#xff0c;可進一步細分&#xff1a;類型名占用存…

應用在核電行業的虛擬現實解決方案

核能領域正處于創新與責任的交匯點。盡管核反應堆提供了高效且可持續的能源&#xff0c;但由于放射性物質的危險性&#xff0c;其也帶來了獨特挑戰。虛擬現實&#xff08;VR&#xff09;技術正通過為遠程操作、應急響應和放射性物質處理提供先進解決方案&#xff0c;徹底革新這…

CTF Web的數組巧用

PHP數組繞過intval和preg_match的CTF技巧 原題目 <?php include("flag.php"); // 引入flag文件&#xff0c;flag變量在這里定義 show_source("index.php"); // 顯示index.php文件的源碼&#xff08;方便選手查看&#xff09;// 判斷是否通過GET方式傳入…

vue2+elementui使用compressorjs壓縮上傳的圖片

首先是npm install compressorjs 然后新建一個compressorjs.js的文件 import Compressor from "compressorjs";// 默認壓縮配置 const DEFAULT_COMPRESS_OPTIONS {quality: 0.6, // 默認壓縮質量 (0-1)maxWidth: 1920, // 最大寬度maxHeight: 1080, // 最大高度con…

GPIO詳解:不僅僅是輸入輸出那么簡單

GPIO詳解&#xff1a;不僅僅是輸入輸出那么簡單 “別小看一個小小的引腳&#xff0c;它可是 MCU 世界的社交之門。” &#x1f44b; 先打個招呼&#xff1a;什么是 GPIO&#xff1f; GPIO&#xff0c;全稱是 General Purpose Input/Output —— 通用輸入輸出口。 簡單說&…

深度學習5(深層神經網絡 + 參數和超參數)

深層神經網絡簡介 深層神經網絡是機器學習中一種重要的模型&#xff0c;它通過增加網絡的“深度”&#xff08;即隱藏層的數量&#xff09;來提升模型對復雜數據的表示和學習能力。同淺層類似&#xff0c;也分為三個部分&#xff1a; 輸入層&#xff1a;接收原始數據&#xff…