十大排序:插入/希爾/選擇/堆/冒泡/快速/歸并/計數/基數/桶排序 匯總(C語言)

目錄

  • 前言
  • 非線性時間比較類
    • 插入排序
      • (1) 直接插入排序
      • (2) 希爾排序
    • 選擇排序
      • (3) 選擇排序優化版
      • (4) 堆排序
    • 交換排序
      • (5) 冒泡排序
      • (6) 快速排序
        • hoare版本
        • 挖坑版
        • 前后指針版
        • 非遞歸版
    • 歸并排序
      • (7) 歸并排序
        • 遞歸版
        • 非遞歸版
  • 線性時間比較類
      • (8) 計數排序
      • 基數排序與桶排序
  • 總結

前言

在這里插入圖片描述
在計算機科學中,排序算法是一種重要的算法類別,用于將一組元素按照特定的順序進行排列。排序算法的應用非常廣泛,從日常生活中的字典排序到大規模數據處理中的并行排序,都離不開排序算法的支持。

本博客將介紹十種常見的排序算法,包括冒泡排序、插入排序、選擇排序、快速排序、歸并排序、堆排序、希爾排序、計數排序、(桶排序和基數排序,稍作了解)。每種算法都會詳細講解其原理、時間復雜度、空間復雜度等關鍵知識點,以及對比不同算法的優劣勢。

通過學習這十種常見的排序算法,讀者將能夠深入理解算法設計和分析的思想,提升自己的編程能力和解決問題的能力。無論是面試、競賽還是實際項目開發,掌握好排序算法都是非常有幫助的。

希望本博客能對讀者有所幫助,讓大家能夠更好地應用排序算法解決實際問題。如果對于排序算法還有疑問或者建議,歡迎留言交流。讓我們一起進入排序算法的世界,開拓自己的算法視野!

博客主頁: 酷酷學!!! 感謝關注! 您的支持是我的極大動力

非線性時間比較類

插入排序

更多詳情點擊: 博客鏈接

(1) 直接插入排序

在這里插入圖片描述

時間復雜度:O(N^2)
最壞:逆序
最好:順序有序,O(N)

// 插入排序
void InsertSort(int* a, int n)
{//默認升序for (int i = 0; i < n - 1; i++)//最后一次將最后一個元素記錄下來,就不要循環到n{//int end = 0;//先寫內層循環,定義下標end,假設第一個元素有序int end = i;//進行改寫,假設前i個位置有序int tmp = a[end + 1];//記錄后一個位置的元素while (end >= 0)//從end下標位置開始依次比較{if (tmp < a[end]){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;//此時a[end+1]位置就是需要插入的位置,跳出循環再插入是為了防止end=0時,//循環無法進入,此時無法進行賦值}
}

(2) 希爾排序

希爾排序是一種排序算法,屬于插入排序的一種改進版本。它通過將數組分成若干個子序列,對每個子序列進行插入排序,然后逐步減少子序列的長度,最終完成排序。希爾排序的核心思想是將數組按照一定間隔分組,然后對每組進行插入排序。這樣可以減少比較和交換的次數,從而提高排序的效率。

時間復雜度: O(N ^ 1.3)

// 希爾排序
void ShellSort(int* a, int n)
{int gap = n;while (gap > 1){gap = gap / 3 + 1;//每次縮小三倍效率是比較高的,+1是為了防止gap==0循環進不來for (int i = 0; i < n - gap; i++)//對每個組進行排序{int end = i;int tmp = a[end + gap];//保存某組數據的后一個數據while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

選擇排序

更多詳情點擊: 博客鏈接

(3) 選擇排序優化版

這里直接給出優化版代碼, 采用雙指針法, 同時選出到最大與最小的元素位置.

void Swap(int* a, int* b)
{int tmp = *a;*a = *b;*b = tmp;
}// 選擇排序
void SelectSort(int* a, int n)
{int begin = 0, end = n - 1;while (begin < end){//雙指針法int min = begin, max = begin;//假設a[begin]為最大和最小值for (int i = begin + 1; i <= end; i++)//選出最大最小元素,保存下標{if (a[i] < a[min]){min = i;}if (a[i] > a[max]){max = i;}}Swap(&a[min], &a[begin]);if (max == begin)//如果begin位置還是max,最大值就被交換到了min位置,故需要判斷{max = min;}Swap(&a[max], &a[end]);begin++;end--;}
}

(4) 堆排序

堆排序(Heap Sort)是一種效率較高的排序算法,它的基本思想是將待排序的序列構建成一個大頂堆,然后將堆頂元素與末尾元素交換,再重新調整堆,直到整個序列有序
在這里插入圖片描述

//向上調整算法,假設建小堆
//比如插入一個新元素,還需要保證是堆的結構就需要進行調整
void AdjustUP(int* a, int child)
{//首先需要找到它的父親結點int parent = (child - 1) / 2;//不管是左孩子還是右孩子都能算出父節點while (child > 0)//這里用child進行條件判斷,用parent<=0會進入死循環,然后巧合結束,不規范{if (a[child] < a[parent]){Swap(&a[child], &a[parent]);child = parent;//讓父節點等于孩子結點,繼續找父節點parent = (child - 1) / 2;}else{break;}}
}
// 堆排序
//如果要刪除堆頂元素,不可以直接刪除,這樣會破壞堆的結構,應該先把堆頂數據與最后一個數據交換
//然后刪除最后一個數據,此時再將堆頂元素進行向下調整,直到滿足堆的性質,調整要保證左右子樹也都是堆
void AdjustDwon(int* a, int n, int root)
{//排升序,建大堆//先假設左孩子大int child = root * 2 + 1;while (child < n)//到最后一個孩子就結束{//右孩子存在且比左孩子大if (child + 1 < n && a[child + 1] > a[child]){child = child + 1;}if (a[child] > a[root]){Swap(&a[child], &a[root]);root = child;child = root * 2 + 1;}else{break;}}
}
//這里用向下調整建堆,效率更高
void HeapSort(int* a, int n)
{//從最后一個非葉子結點開始建堆for (int i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDwon(a, n, i);}//建堆完畢,將第一個元素與最后一個元素交換,再次調整int end = n - 1;while (end > 0){Swap(&a[end], &a[0]);AdjustDwon(a, end, 0);//此時調整最后一個元素之前的數組end--;}
}

交換排序

更多詳情點擊: 博客鏈接

(5) 冒泡排序

冒泡排序是一種簡單的交換排序算法,它通過不斷地比較相鄰的元素,如果順序不對就交換它們的位置,直到整個列表或數組排好序。

快速排序是一種高效的交換排序算法,它通過選擇一個基準元素,將小于基準元素的元素放在它的左邊,大于基準元素的元素放在它的右邊,然后再對左右兩部分進行遞歸調用快速排序,直到整個列表或數組排好序。

交換排序的時間復雜度通常是O(n^2),但在最好情況下,快速排序的時間復雜度可以達到O(nlogn)

//冒泡排序
void BubbleSort(int* a, int n)
{//先寫內層循環//先找出最大的for (int i = 0; i < n - 1 ; i++){int flag = 1;//兩兩比較,先找最大的,然后找次大的for (int j = 0; j < n - 1 - i; j++)//i代表找到了幾個最大的{if (a[j] > a[j + 1]){flag = 0;Swap(&a[j], &a[j + 1]);}}if (flag == 1)//如果flag==1說明沒有進行交換則說明已經有序了break;}
}

(6) 快速排序

hoare版本

在這里插入圖片描述

int GetMidi(int* a, int left, int right)
{int midi = (right - left) / 2;if (a[left] < a[midi]){if (a[midi] < a[right]){return midi;}else if (a[left] < a[right]){return right;}else{return left;}}else//a[left] > a[midi]{if (a[left] < a[right]){return left;}else if (a[midi] > a[right]){return midi;}else{return right;}}
}// 快速排序hoare版本
int PartSort1(int* a, int left, int right)
{//三數取中,取中等的值作為基準值int midi = GetMidi(a, left, right);Swap(&a[left], &a[midi]);int keyi = left;int begin = left, end = right;while (begin < end){//要保證keyi的值小于相遇位置,所以end先走while (begin < end && a[end] >= a[keyi]){end--;}while (begin < end && a[begin] <= a[keyi]){begin++;}Swap(&a[begin], &a[end]);}Swap(&a[begin], &a[keyi]);//相遇位置與keyi交換此時這個位置就排好了return begin;
}

為了方便, 我們單獨將hoare版本寫為函數PartSort1,需要使用的時候直接調用

// 快速排序遞歸實現
void QuickSort(int* a, int left, int right)
{if (left >= right){return;}if ((right - left + 1) < 10){InsertSort(a + left, right - left + 1);}//int keyi = left;//選取基準值//int begin = left, end = right;//begin找找大,end找小,然后交換//小區間優化,優化遞歸//if ((right - left + 1) < 10)//{//	InsertSort(a + left,right - left + 1);//}//else//{//	//三數取中,取中等的值作為基準值//	int midi = GetMidi(a, left, right);//	Swap(&a[left], &a[midi]);//	int keyi = left;//	int begin = left, end = right;//	while (begin < end)//	{//		//要保證keyi的值小于相遇位置,所以end先走//		while (begin < end && a[end] >= a[keyi])//		{//			end--;//		}//		while (begin < end && a[begin] <= a[keyi])//		{//			begin++;//		}//		Swap(&a[begin], &a[end]);//	}//	Swap(&a[begin], &a[keyi]);//相遇位置與keyi交換此時這個位置就排好了//	keyi = begin;//	QuickSort(a, left, keyi - 1);//	QuickSort(a, keyi + 1, right);//}//int keyi = PartSort1(a, left, right);//int keyi = PartSort2(a, left, right);int keyi = PartSort3(a, left, right);QuickSort(a, left, keyi - 1);QuickSort(a, keyi + 1, right);
}
挖坑版

在這里插入圖片描述

// 快速排序挖坑法
int PartSort2(int* a, int left, int right)
{//三數取中int midi = GetMidi(a, left, right);Swap(&a[left], &a[midi]);int keyi = left;int begin = left, end = right;//先挖個坑,保存a[keyi]的值int tmp = a[keyi];while (begin < end){//讓對面先走,找小while (begin < end && a[end] >= a[keyi]){end--;}a[keyi] = a[end];keyi = end;while (begin < end && a[begin] <= a[keyi]){begin++;}a[keyi] = a[begin];keyi = begin;}//相遇之后把tmp填坑a[keyi] = tmp;return keyi;
}
前后指針版

在這里插入圖片描述

// 快速排序前后指針法
int PartSort3(int* a, int left, int right)
{//三數取中int midi = GetMidi(a, left, right);Swap(&a[left], &a[midi]);int keyi = left;//定義前后指針,這樣不需要考慮是begin先走還是end先走//初始prev在前,cur在后一個位置,如果cur小于keyi則與++prev進行交換int prev = left;int cur = prev + 1;while (cur <= right){if (a[cur] < a[keyi] && ++prev != cur)//如果在同一個位置就不需要交換{Swap(&a[cur], &a[prev]);}cur++;}Swap(&a[prev], &a[keyi]);return prev;
}
非遞歸版

可以使用隊列進行存儲區間

//非遞歸版
#include"stack.h"
void QuickSortNonR(int* a, int left, int right)
{ST st;STInit(&st);STPush(&st, right);STPush(&st, left);while (!STEmpty(&st)){int begin = STTop(&st);STPop(&st);int end = STTop(&st);STPop(&st);int keyi = PartSort1(a, begin, end);//[begin,keyi-1] keyi [keyi+1,end]//先壓入右區間if (keyi + 1 < end){STPush(&st, end);STPush(&st, keyi + 1);}if (begin < keyi - 1){STPush(&st, keyi - 1);STPush(&st, begin);}}Destroy(&st);
}

歸并排序

更多詳情點擊: 博客鏈接

歸并排序是一種經典的排序算法,它基于分治的思想。
歸并排序的時間復雜度是O(nlogn),其中n是待排序數組的元素個數。

歸并排序是一種穩定的排序算法,適用于各種數據規模。它的主要缺點是需要額外的空間來存儲臨時數組。

(7) 歸并排序

在這里插入圖片描述

遞歸版
void _MergeSort(int* a, int* tmp, int begin,int end)//傳遞區間遞歸調用
{if (begin >= end){return;}int mid = (begin + end) / 2;_MergeSort(a, tmp, begin, mid);_MergeSort(a, tmp, mid + 1, end);int begin1 = begin, end1 = mid;int begin2 = mid + 1, end2 = end;int j = begin;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[j++] = a[begin1++];}else{tmp[j++] = a[begin2++];}}while (begin1 <= end1){tmp[j++] = a[begin1++];}while (begin2 <= end2){tmp[j++] = a[begin2++];}memcpy(a + begin, tmp + begin, sizeof(int) * (end - begin + 1));
}// 歸并排序遞歸實現
void MergeSort(int* a, int n)
{int* tmp = malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}_MergeSort(a, tmp, 0, n - 1);free(tmp);tmp = NULL;
}
非遞歸版
// 歸并排序非遞歸實現
void MergeSortNonR(int* a, int n)
{int* tmp = (int*)malloc(sizeof(int) * n);if (tmp == NULL){perror("malloc fail");return;}int gap = 1; //11歸并while (gap < n){for (int i = 0; i < n; i += gap*2){int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;int j = i;if (begin2 >= n){break;}if (end2 >= n){end2 = n - 1;}while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[j++] = a[begin1++];}else{tmp[j++] = a[begin2++];}}while (begin1 <= end1){tmp[j++] = a[begin1++];}while (begin2 <= end2){tmp[j++] = a[begin2++];}memcpy(a + i, tmp + i, sizeof(int) * (end2 - i + 1));}gap *= 2;}free(tmp);tmp = NULL;
}

線性時間比較類

(8) 計數排序

時間復雜度:O(N+range)
只適合整數/適合范圍集中
空間范圍度:O(range)

// 計數排序
void CountSort(int* a, int n)
{//找數的范圍int max = a[0], min = a[0];for (int i = 1; i < n; i++){if (a[i] < min)min = a[i];if (a[i] > max)max = a[i];}int range = max - min + 1;//需要開辟的空間大小int* count = (int*)calloc(range, sizeof(int));//malloc需要手動初始化,而calloc默認初始化為0if (count == NULL){perror("calloc fail");return;}//開始計數for (int i = 0; i < n; i++){count[a[i] - min]++;}//開始排序int j = 0;for (int i = 0; i < range; i++){while (count[i]--){a[j++] = i + min;}}free(count);
}

基數排序與桶排序

這兩種排序只需要稍作了解, 面試一般沒有.

基數排序是一種非比較排序算法,它根據數字的位數進行排序。基數排序的基本思想是將整數按照個位、十位、百位等位數進行排序,最終得到有序的結果。

基數排序的步驟如下:

首先找到待排序數組中的最大值,并確定其位數,記為max_digits。
創建10個桶,分別代表數字0-9。
從個位開始,將所有數字放入對應的桶中。
依次取出桶中的數字,并按照順序放回原數組中。
重復步驟3和步驟4,直到按照最高位排序完畢。
基數排序的時間復雜度為O(n*k),其中n是待排序數組的長度,k是最大位數。需要注意的是,基數排序只適用于整數排序,且要求待排序數字必須是非負數。
在這里插入圖片描述

桶排序是一種排序算法,它將數據按照一定的范圍劃分為多個桶,然后對每個桶中的數據進行排序,最后將每個桶中的元素按照順序依次取出來得到有序序列。

具體的桶排序算法如下:

創建一個定量的空桶數組。
遍歷輸入數據,并將每個元素放入對應的桶中。
對每個非空桶中的元素進行排序。
依次將非空桶中的元素取出,并放入輸出序列。
桶排序的時間復雜度取決于對每個桶中的元素進行排序的算法,通常采用的是快速排序或插入排序,所以整體的時間復雜度為O(n+k),其中n為待排序序列的長度,k為桶的數量。

桶排序適用于數據分布較均勻的情況,當數據分布不均勻時,不同的桶中的數據量差別較大,可能會導致某些桶中的數據在排序后仍然不是有序的,因此對于不同的數據分布情況,桶的數量和每個桶的容量需要適當調整。

在這里插入圖片描述

總結

在這里插入圖片描述
在這里插入圖片描述
穩定性 :三穩四不穩
穩定性指的是, 相同的值,其相對位置排序后保持不變,作用一般在排列結構體數據時,比如高考總分排列,但是總分相同,就按照語文成績高低排列, 此時可以使用穩定排序, 先排語文成績,在排總成績.
計數排序,基數排序和桶排序因為排列數據具有局限性,所以這里不探討其穩定性

選擇排序為什么不是穩定的?

比如下列情況
{ 6 , 1 , 1} 這種情況將第二個1換到前面, 相對位置不變
{ 6, 6, 1}但是這種情況相同的6卻因為選擇發生了變化, 所以是不穩定的.

為什么快速排序具有空間消耗?
因為遞歸會創建棧幀空間.


冒泡排序:

比較相鄰的元素,如果前一個比后一個大,則交換位置,直到將最大的元素移到最后。
時間復雜度:平均O(n^ 2),最好情況O(n),最壞情況O(n^2)。
選擇排序:

每次從未排序的元素中選擇最小的元素,放到已排序的末尾。
時間復雜度:平均O(n^ 2),最好情況O(n^2),最壞情況O(n ^2)。
插入排序:

將未排序的元素逐個插入到已排序的序列中的正確位置。
時間復雜度:平均O(n^ 2),最好情況O(n),最壞情況O(n^2)。
希爾排序:

根據間隔將序列劃分為多個子序列,對子序列進行插入排序,然后縮小間隔直至最后一次插入排序。
時間復雜度:平均O(n log n),最好情況O(n log^ 2 n),最壞情況O(n^2)。
歸并排序:

將序列遞歸地拆分成兩個子序列,然后將兩個有序子序列合并為一個有序序列。
時間復雜度:平均O(n log n),最好情況O(n log n),最壞情況O(n log n)。
快速排序:

選擇一個基準元素,將序列分為兩部分,小于基準的放在左邊,大于基準的放在右邊,然后遞歸地對兩個部分進行快速排序。
時間復雜度:平均O(n log n),最好情況O(n log n),最壞情況O(n^2)。
堆排序:

將序列構建成一個最大堆,然后不斷將堆頂元素與最后一個元素交換,并重新調整堆,直到所有元素都有序。
時間復雜度:平均O(n log n),最好情況O(n log n),最壞情況O(n log n)。
計數排序:

統計每個元素的出現次數,然后根據統計結果將元素放回原數組。
時間復雜度:平均O(n+k),最好情況O(n+k),最壞情況O(n+k)。
桶排序:

將元素分到不同的桶中,然后對每個桶進行排序,最后按順序將元素取出。
時間復雜度:平均O(n+k),最好情況O(n),最壞情況O(n^2)。
基數排序:

根據元素的位數依次進行排序,從最低位到最高位。
時間復雜度:平均O(nk),最好情況O(nk),最壞情況O(n*k)。


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

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

相關文章

報文交換 和 電路交換對比說明

報文交換 和 電路交換 是兩種不同的網絡通信方式&#xff0c;它們在數據傳輸的方式、效率、成本和適用場景等方面有所不同。下面詳細對比這兩種交換方式&#xff0c;并舉例說明。 報文交換&#xff08;Message Switching&#xff09; 定義&#xff1a;報文交換是一種存儲-轉發…

昇思25天學習打卡營第13天|基于MindSpore通過GPT實現情感分類

基于MindSpore通過GPT實現情感分類 情感分類 情感分類是指在自然語言處理(NLP)領域中,通過分析文本內容所表達的情感傾向,將文本歸類為正面、負面或中性等類別的任務。 在情感分類中,基于不同的方法和技術,可以分為基于情感詞典的方法、基于傳統機器學習的方法和基于深…

c++筆試題

語言特性 題目1&#xff1a;請解釋C11中新引入的auto和decltype關鍵字&#xff0c;并給出使用示例。 題目2&#xff1a;什么是RAII&#xff08;Resource Acquisition Is Initialization&#xff09;&#xff1f;請解釋其原理并舉例說明。 題目3&#xff1a;C11引入了move se…

【unity實戰】使用舊輸入系統Input Manager 寫一個 2D 平臺游戲玩家控制器——包括移動、跳躍、滑墻、蹬墻跳

最終效果 文章目錄 最終效果素材下載人物環境 簡單繪制環境角色移動跳躍視差和攝像機跟隨效果奔跑動畫切換跳躍動畫&#xff0c;跳躍次數限制角色添加2d物理材質&#xff0c;防止角色粘在墻上如果角色移動時背景出現黑線條方法一方法二 墻壁滑行實現角色滑墻不可以通過移動離開…

Web貴州旅游攻略系統-計算機畢業設計源碼16663

目 錄 第 1 章 引 言 1.1 選題背景與意義 1.2 國內外研究現狀 1.3 論文結構安排 第 2 章 系統的需求分析 2.1 系統可行性分析 2.1.1 技術方面可行性分析 2.1.2 經濟方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系統功能需求分析 2.3 系…

前端面試題18(js字符串特定內容查找方法)

在JavaScript中&#xff0c;有多種方法可以用來查找字符串中的特定內容。以下是一些常用的方法&#xff0c;包括它們的用途和示例代碼&#xff1a; 1. indexOf() indexOf() 方法返回指定文本在字符串中第一次出現的索引&#xff08;位置&#xff09;&#xff0c;如果沒有找到…

初學者打字練習平臺推薦

大牛打字練習平臺 (ccfoj.com) 適合人群&#xff1a;c初學者&#xff0c;10~20歲不定&#xff0c;有效提高對代碼的熟悉程度&#xff0c;以及鍛煉打字速度。 TypingClub TypingClub是一個免費的在線打字練習平臺&#xff0c;提供各種打字練習內容&#xff0c;從基礎到高級。…

pulsar單節點能開啟事務嗎?是不是真的

Apache Pulsar 支持事務&#xff0c;但是需要在分布式模式下運行。單節點模式下不支持 Pulsar 事務。事務功能在 Pulsar 中依賴于分布式的 BookKeeper 存儲服務&#xff0c;以確保事務的持久性和可靠性。 具體來說&#xff1a; 分布式模式和事務支持&#xff1a; 在分布式部署…

MyBatis(26)MyBatis 有哪些方式可以實現多數據源管理

在企業級應用開發中&#xff0c;有時需要同時操作多個數據庫&#xff0c;這就涉及到多數據源管理的問題。MyBatis作為一個流行的持久層框架&#xff0c;本身并沒有直接提供多數據源管理的功能&#xff0c;但是可以通過與Spring等框架結合&#xff0c;或者通過自定義方式來實現多…

【vue組件庫搭建04】使用vitepress搭建站點并部署到github

前言 基于vitePress搭建文檔站點&#xff0c;使用github pages進行部署 安裝VitePress 1.Node.js 18 及以上版本 2.npm add -D vitepress 3.npx vitepress init 4.將需要回答幾個簡單的問題&#xff1a; ┌ Welcome to VitePress! │ ◇ Where should VitePress initi…

Cesium 二三維熱力圖

Cesium 二三維熱力圖 原理&#xff1a;主要依靠heatmap.js包來實現 效果圖&#xff1a;

elementPlus-vue3-ts表格單選和雙選實現方式

記錄在vue3、ts、element-plus環境下表格單選和多選的實現方式 單選 html部分 <el-table...reftaskTableRefselect"selectClick"... ><el-table-column type"selection" width"50" />... </el-table>ts部分 const taskTabl…

三相異步電動機的起動方法

1. 引言 2. 三相籠型異步電動機德起動方法 3. 三相繞線型異步電動機的起動方法 4. 軟起動器起動 5. 參考文獻 1 引言 三相異步電動機結構簡單﹑價格低廉﹑運行可靠﹑維護方便&#xff0c;在工農業生產中得到了廣泛應用。為使電動機能夠轉動起來&#xff0c;并很快達到工作轉…

內存拷貝函數對比測試

內存拷貝函數 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <errno.h> #include <xmmintrin.h> // SSE Intrinsics#define SIZE_1K 1024 #define SIZE_1M (1024 * 1024)void* aligned_malloc…

低代碼平臺在企業數字化轉型中的關鍵角色與應用

隨著數字化轉型的深入推進&#xff0c;企業越來越依賴于快速、靈活的軟件開發和部署方案。傳統的軟件開發往往需要大量的編碼工作和專業技能&#xff0c;而低代碼開發平臺則通過簡化開發流程、降低技術門檻&#xff0c;為企業提供了一種新的解決方案。本文將探討低代碼開發平臺…

從零開始使用WordPress搭建個人網站并一鍵發布公網詳細教程

文章目錄 前言1. 搭建網站&#xff1a;安裝WordPress2. 搭建網站&#xff1a;創建WordPress數據庫3. 搭建網站&#xff1a;安裝相對URL插件4. 搭建網站&#xff1a;內網穿透發布網站4.1 命令行方式&#xff1a;4.2. 配置wordpress公網地址 5. 固定WordPress公網地址5.1. 固定地…

ChatGPT:為什么很多算法經過二分思想的優化就變成了logn

ChatGPT&#xff1a;為什么很多算法經過二分思想的優化就變成了logn 很多算法在經過二分思想優化后&#xff0c;時間復雜度變成 O(log?n)&#xff0c;這主要是因為二分思想能夠顯著減少問題的規模。具體來說&#xff0c;二分思想通常應用于那些問題規模可以通過每一步驟減半的…

【LabVIEW學習篇 - 2】:LabVIEW的編程特點

文章目錄 LabVIEW的編程特點圖形編程天然并行運行基于數據流運行 LabVIEW的編程特點 圖形編程 LabVIEW使用圖形化的圖形化編程語言&#xff08;G語言&#xff09;&#xff0c;用戶通過在程序框圖中拖放和連接各種節點&#xff08;Nodes&#xff09;來編寫程序。每個節點代表一…

什么是跨域?——詳解跨域問題及其解決方案

目錄 引言什么是跨域同源策略跨域的產生原因跨域的常見解決方案 JSONPCORS代理服務器nginx反向代理后端設置允許跨域 CORS的詳細實現 瀏覽器中的CORS支持服務器端的CORS配置 常見的跨域場景和解決方案 跨域請求API跨域加載資源 跨域的安全性考慮跨域調試技巧總結 引言 在現代…

python+playwright 學習-90 and_ 和 or_ 定位

前言 playwright 從v1.34 版本以后支持and_ 和 or_ 定位 XPath 中的and和or xpath 語法中我們常用的有text()、contains() 、ends_with()、starts_with() //*[text()="文本"] //*[contains(@id, "xx")] //