十大經典排序算法(動圖演示)

轉自:https://www.cnblogs.com/onepixel/articles/7674659.html

?

0、算法概述

0.1 算法分類

十種常見排序算法可以分為兩大類:

非線性時間比較類排序:通過比較來決定元素間的相對次序,由于其時間復雜度不能突破O(nlogn),因此稱為非線性時間比較類排序。

線性時間非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基于比較排序的時間下界,以線性時間運行,因此稱為線性時間非比較類排序。?

0.2 算法復雜度

0.3 相關概念

穩定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。

不穩定:如果a原本在b的前面,而a=b,排序之后 a 可能會出現在 b 的后面。

時間復雜度:對排序數據的總的操作次數。反映當n變化時,操作次數呈現什么規律。

空間復雜度:是指算法在計算機內執行時所需存儲空間的度量,它也是數據規模n的函數。?

1、冒泡排序(Bubble Sort)

冒泡排序是一種簡單的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。?

1.1 算法描述

  • 比較相鄰的元素。如果第一個比第二個大,就交換它們兩個;
  • 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對,這樣在最后的元素應該會是最大的數;
  • 針對所有的元素重復以上的步驟,除了最后一個;
  • 重復步驟1~3,直到排序完成。

1.2 動圖演示

1.3 代碼實現

1
2
3
4
5
6
7
8
9
10
11
12
13
function bubbleSort(arr) {
????var?len = arr.length;
????for?(var?i = 0; i < len - 1; i++) {
????????for?(var?j = 0; j < len - 1 - i; j++) {
????????????if?(arr[j] > arr[j+1]) {???????// 相鄰元素兩兩對比
????????????????var?temp = arr[j+1];???????// 元素交換
????????????????arr[j+1] = arr[j];
????????????????arr[j] = temp;
????????????}
????????}
????}
????return?arr;
}

2、選擇排序(Selection Sort)

選擇排序(Selection-sort)是一種簡單直觀的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。?

2.1 算法描述

n個記錄的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。具體算法描述如下:

  • 初始狀態:無序區為R[1..n],有序區為空;
  • 第i趟排序(i=1,2,3…n-1)開始時,當前有序區和無序區分別為R[1..i-1]和R(i..n)。該趟排序從當前無序區中-選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R[i+1..n)分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區;
  • n-1趟結束,數組有序化了。

2.2 動圖演示

  

2.3 代碼實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function selectionSort(arr) {
????var?len = arr.length;
????var?minIndex, temp;
????for?(var?i = 0; i < len - 1; i++) {
????????minIndex = i;
????????for?(var?j = i + 1; j < len; j++) {
????????????if?(arr[j] < arr[minIndex]) {????// 尋找最小的數
????????????????minIndex = j;????????????????// 將最小數的索引保存
????????????}
????????}
????????temp = arr[i];
????????arr[i] = arr[minIndex];
????????arr[minIndex] = temp;
????}
????return?arr;
}?

2.4 算法分析

表現最穩定的排序算法之一,因為無論什么數據進去都是O(n2)的時間復雜度,所以用到它的時候,數據規模越小越好。唯一的好處可能就是不占用額外的內存空間了吧。理論上講,選擇排序可能也是平時排序一般人想到的最多的排序方法了吧。

3、插入排序(Insertion Sort)

插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列,對于未排序數據,在已排序序列中從后向前掃描,找到相應位置并插入。

3.1 算法描述

一般來說,插入排序都采用in-place在數組上實現。具體算法描述如下:

  • 從第一個元素開始,該元素可以認為已經被排序;
  • 取出下一個元素,在已經排序的元素序列中從后向前掃描;
  • 如果該元素(已排序)大于新元素,將該元素移到下一位置;
  • 重復步驟3,直到找到已排序的元素小于或者等于新元素的位置;
  • 將新元素插入到該位置后;
  • 重復步驟2~5。

3.2 動圖演示

3.2 代碼實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function insertionSort(arr) {
????var?len = arr.length;
????var?preIndex, current;
????for?(var?i = 1; i < len; i++) {
????????preIndex = i - 1;
????????current = arr[i];
????????while?(preIndex >= 0 && arr[preIndex] > current) {
????????????arr[preIndex + 1] = arr[preIndex];
????????????preIndex--;
????????}
????????arr[preIndex + 1] = current;
????}
????return?arr;
}

3.4 算法分析

插入排序在實現上,通常采用in-place排序(即只需用到O(1)的額外空間的排序),因而在從后向前掃描過程中,需要反復把已排序元素逐步向后挪位,為最新元素提供插入空間。

4、希爾排序(Shell Sort)

1959年Shell發明,第一個突破O(n2)的排序算法,是簡單插入排序的改進版。它與插入排序的不同之處在于,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序

4.1 算法描述

先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序,具體算法描述:

  • 選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  • 按增量序列個數k,對序列進行k 趟排序;
  • 每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子序列,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。

4.2 動圖演示

4.3 代碼實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function shellSort(arr) {
????var?len = arr.length,
????????temp,
????????gap = 1;
????while?(gap < len / 3) {?????????// 動態定義間隔序列
????????gap = gap * 3 + 1;
????}
????for?(gap; gap > 0; gap = Math.floor(gap / 3)) {
????????for?(var?i = gap; i < len; i++) {
????????????temp = arr[i];
????????????for?(var?j = i-gap; j > 0 && arr[j]> temp; j-=gap) {
????????????????arr[j + gap] = arr[j];
????????????}
????????????arr[j + gap] = temp;
????????}
????}
????return?arr;
}

4.4 算法分析

希爾排序的核心在于間隔序列的設定。既可以提前設定好間隔序列,也可以動態的定義間隔序列。動態定義間隔序列的算法是《算法(第4版)》的合著者Robert Sedgewick提出的。 

5、歸并排序(Merge Sort)

歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一個有序表,稱為2-路歸并。?

5.1 算法描述

  • 把長度為n的輸入序列分成兩個長度為n/2的子序列;
  • 對這兩個子序列分別采用歸并排序;
  • 將兩個排序好的子序列合并成一個最終的排序序列。

5.2 動圖演示

5.3 代碼實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function mergeSort(arr) {?// 采用自上而下的遞歸方法
????var?len = arr.length;
????if?(len < 2) {
????????return?arr;
????}
????var?middle = Math.floor(len / 2),
????????left = arr.slice(0, middle),
????????right = arr.slice(middle);
????return?merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
????var?result = [];
????while?(left.length>0 && right.length>0) {
????????if?(left[0] <= right[0]) {
????????????result.push(left.shift());
????????}else?{
????????????result.push(right.shift());
????????}
????}
????while?(left.length)
????????result.push(left.shift());
????while?(right.length)
????????result.push(right.shift());
????return?result;
}

5.4 算法分析

歸并排序是一種穩定的排序方法。和選擇排序一樣,歸并排序的性能不受輸入數據的影響,但表現比選擇排序好的多,因為始終都是O(nlogn)的時間復雜度。代價是需要額外的內存空間。

6、快速排序(Quick Sort)

快速排序的基本思想:通過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。

6.1 算法描述

快速排序使用分治法來把一個串(list)分為兩個子串(sub-lists)。具體算法描述如下:

  • 從數列中挑出一個元素,稱為 “基準”(pivot);
  • 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數可以到任一邊)。在這個分區退出之后,該基準就處于數列的中間位置。這個稱為分區(partition)操作;
  • 遞歸地(recursive)把小于基準值元素的子數列和大于基準值元素的子數列排序。

6.2 動圖演示

6.3 代碼實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function quickSort(arr, left, right) {
????var?len = arr.length,
????????partitionIndex,
????????left =typeof?left !='number'?? 0 : left,
????????right =typeof?right !='number'?? len - 1 : right;
????if?(left < right) {
????????partitionIndex = partition(arr, left, right);
????????quickSort(arr, left, partitionIndex-1);
????????quickSort(arr, partitionIndex+1, right);
????}
????return?arr;
}
function partition(arr, left ,right) {????// 分區操作
????var?pivot = left,?????????????????????// 設定基準值(pivot)
????????index = pivot + 1;
????for?(var?i = index; i <= right; i++) {
????????if?(arr[i] < arr[pivot]) {
????????????swap(arr, i, index);
????????????index++;
????????}???????
????}
????swap(arr, pivot, index - 1);
????return?index-1;
}
function swap(arr, i, j) {
????var?temp = arr[i];
????arr[i] = arr[j];
????arr[j] = temp;
}

7、堆排序(Heap Sort)

堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序算法。堆積是一個近似完全二叉樹的結構,并同時滿足堆積的性質:即子結點的鍵值或索引總是小于(或者大于)它的父節點。

7.1 算法描述

  • 將初始待排序關鍵字序列(R1,R2….Rn)構建成大頂堆,此堆為初始的無序區;
  • 將堆頂元素R[1]與最后一個元素R[n]交換,此時得到新的無序區(R1,R2,……Rn-1)和新的有序區(Rn),且滿足R[1,2…n-1]<=R[n];
  • 由于交換后新的堆頂R[1]可能違反堆的性質,因此需要對當前無序區(R1,R2,……Rn-1)調整為新堆,然后再次將R[1]與無序區最后一個元素交換,得到新的無序區(R1,R2….Rn-2)和新的有序區(Rn-1,Rn)。不斷重復此過程直到有序區的元素個數為n-1,則整個排序過程完成。

7.2 動圖演示

7.3 代碼實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
var?len;???// 因為聲明的多個函數都需要數據長度,所以把len設置成為全局變量
function buildMaxHeap(arr) {??// 建立大頂堆
????len = arr.length;
????for?(var?i = Math.floor(len/2); i >= 0; i--) {
????????heapify(arr, i);
????}
}
function heapify(arr, i) {????// 堆調整
????var?left = 2 * i + 1,
????????right = 2 * i + 2,
????????largest = i;
????if?(left < len && arr[left] > arr[largest]) {
????????largest = left;
????}
????if?(right < len && arr[right] > arr[largest]) {
????????largest = right;
????}
????if?(largest != i) {
????????swap(arr, i, largest);
????????heapify(arr, largest);
????}
}
function swap(arr, i, j) {
????var?temp = arr[i];
????arr[i] = arr[j];
????arr[j] = temp;
}
function heapSort(arr) {
????buildMaxHeap(arr);
????for?(var?i = arr.length - 1; i > 0; i--) {
????????swap(arr, 0, i);
????????len--;
????????heapify(arr, 0);
????}
????return?arr;
}

8、計數排序(Counting Sort)

計數排序不是基于比較的排序算法,其核心在于將輸入的數據值轉化為鍵存儲在額外開辟的數組空間中。 作為一種線性時間復雜度的排序,計數排序要求輸入的數據必須是有確定范圍的整數。

8.1 算法描述

  • 找出待排序的數組中最大和最小的元素;
  • 統計數組中每個值為i的元素出現的次數,存入數組C的第i項;
  • 對所有的計數累加(從C中的第一個元素開始,每一項和前一項相加);
  • 反向填充目標數組:將每個元素i放在新數組的第C(i)項,每放一個元素就將C(i)減去1。

8.2 動圖演示

8.3 代碼實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function countingSort(arr, maxValue) {
????var?bucket =new?Array(maxValue + 1),
????????sortedIndex = 0;
????????arrLen = arr.length,
????????bucketLen = maxValue + 1;
????for?(var?i = 0; i < arrLen; i++) {
????????if?(!bucket[arr[i]]) {
????????????bucket[arr[i]] = 0;
????????}
????????bucket[arr[i]]++;
????}
????for?(var?j = 0; j < bucketLen; j++) {
????????while(bucket[j] > 0) {
????????????arr[sortedIndex++] = j;
????????????bucket[j]--;
????????}
????}
????return?arr;
}

8.4 算法分析

計數排序是一個穩定的排序算法。當輸入的元素是 n 個 0到 k 之間的整數時,時間復雜度是O(n+k),空間復雜度也是O(n+k),其排序速度快于任何比較排序算法。當k不是很大并且序列比較集中時,計數排序是一個很有效的排序算法。

9、桶排序(Bucket Sort)

桶排序是計數排序的升級版。它利用了函數的映射關系,高效與否的關鍵就在于這個映射函數的確定。桶排序 (Bucket sort)的工作的原理:假設輸入數據服從均勻分布,將數據分到有限數量的桶里,每個桶再分別排序(有可能再使用別的排序算法或是以遞歸方式繼續使用桶排序進行排)。

9.1 算法描述

  • 設置一個定量的數組當作空桶;
  • 遍歷輸入數據,并且把數據一個一個放到對應的桶里去;
  • 對每個不是空的桶進行排序;
  • 從不是空的桶里把排好序的數據拼接起來。?

9.2 圖片演示

9.3 代碼實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function bucketSort(arr, bucketSize) {
????if?(arr.length === 0) {
??????return?arr;
????}
????var?i;
????var?minValue = arr[0];
????var?maxValue = arr[0];
????for?(i = 1; i < arr.length; i++) {
??????if?(arr[i] < minValue) {
??????????minValue = arr[i];???????????????// 輸入數據的最小值
??????}else?if?(arr[i] > maxValue) {
??????????maxValue = arr[i];???????????????// 輸入數據的最大值
??????}
????}
????// 桶的初始化
????var?DEFAULT_BUCKET_SIZE = 5;???????????// 設置桶的默認數量為5
????bucketSize = bucketSize || DEFAULT_BUCKET_SIZE;
????var?bucketCount = Math.floor((maxValue - minValue) / bucketSize) + 1;??
????var?buckets =new?Array(bucketCount);
????for?(i = 0; i < buckets.length; i++) {
????????buckets[i] = [];
????}
????// 利用映射函數將數據分配到各個桶中
????for?(i = 0; i < arr.length; i++) {
????????buckets[Math.floor((arr[i] - minValue) / bucketSize)].push(arr[i]);
????}
????arr.length = 0;
????for?(i = 0; i < buckets.length; i++) {
????????insertionSort(buckets[i]);?????????????????????// 對每個桶進行排序,這里使用了插入排序
????????for?(var?j = 0; j < buckets[i].length; j++) {
????????????arr.push(buckets[i][j]);?????????????????????
????????}
????}
????return?arr;
}

9.4 算法分析

桶排序最好情況下使用線性時間O(n),桶排序的時間復雜度,取決與對各個桶之間數據進行排序的時間復雜度,因為其它部分的時間復雜度都為O(n)。很顯然,桶劃分的越小,各個桶之間的數據越少,排序所用的時間也會越少。但相應的空間消耗就會增大。?

10、基數排序(Radix Sort)

基數排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次類推,直到最高位。有時候有些屬性是有優先級順序的,先按低優先級排序,再按高優先級排序。最后的次序就是高優先級高的在前,高優先級相同的低優先級高的在前。

10.1 算法描述

  • 取得數組中的最大數,并取得位數;
  • arr為原始數組,從最低位開始取每個位組成radix數組;
  • 對radix進行計數排序(利用計數排序適用于小范圍數的特點);

10.2 動圖演示

?

10.3 代碼實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// LSD Radix Sort
var?counter = [];
function radixSort(arr, maxDigit) {
????var?mod = 10;
????var?dev = 1;
????for?(var?i = 0; i < maxDigit; i++, dev *= 10, mod *= 10) {
????????for(var?j = 0; j < arr.length; j++) {
????????????var?bucket = parseInt((arr[j] % mod) / dev);
????????????if(counter[bucket]==null) {
????????????????counter[bucket] = [];
????????????}
????????????counter[bucket].push(arr[j]);
????????}
????????var?pos = 0;
????????for(var?j = 0; j < counter.length; j++) {
????????????var?value =null;
????????????if(counter[j]!=null) {
????????????????while?((value = counter[j].shift()) !=null) {
??????????????????????arr[pos++] = value;
????????????????}
??????????}
????????}
????}
????return?arr;
}

10.4 算法分析

基數排序基于分別排序,分別收集,所以是穩定的。但基數排序的性能比桶排序要略差,每一次關鍵字的桶分配都需要O(n)的時間復雜度,而且分配之后得到新的關鍵字序列又需要O(n)的時間復雜度。假如待排數據可以分為d個關鍵字,則基數排序的時間復雜度將是O(d*2n) ,當然d要遠遠小于n,因此基本上還是線性級別的。

基數排序的空間復雜度為O(n+k),其中k為桶的數量。一般來說n>>k,因此額外空間需要大概n個左右。

轉載于:https://www.cnblogs.com/x_wukong/p/10242246.html

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

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

相關文章

【Python】安裝配置Anaconda

優點&#xff1a;解決Python 庫依賴問題清華安裝鏡像https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 轉載于:https://www.cnblogs.com/Neo007/p/7419253.html

如何實現 WPF 視頻封面查看器

如何實現 WPF 視頻封面查看器控件名&#xff1a;NineGridView作 者&#xff1a;WPFDevelopersOrg - 驚鏵原文鏈接[1]&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET40&#xff1b;Visual Studio 2019;實現視頻封面查看器NineGridView基于Grid實…

如何從Internet Explorer或Edge遷移到Chrome(以及為什么要遷移)

Google’s Chrome web browser is now more widely used than Microsoft’s Internet Explorer and Edge combined. If you haven’t switched to Chrome yet, here’s why you might want to–and how to quickly switch over. Google的Chrome網絡瀏覽器現在的使用范圍比Micro…

SQL中觸發器的使用

創建觸發器 是特殊的存儲過程&#xff0c;自動執行&#xff0c;一般不要有返回值 類型&#xff1a; 1.后觸發器 &#xff08;AFTER,FOR&#xff09;先執行對應語句&#xff0c;后執行觸發器中的語句 2.前觸發器 并沒有真正的執行觸發語句&#xff08;insert&#xff0c;update…

powershell XML數據保存為HTML

1.設置html頭和尾 beginning內包含表格表頭 $beginning {<html><head><meta charset"utf-8" /><title>Report</title><STYLE type"text/css">h1 {font-family:SegoeUI, sans-serif; font-size:30}th {font-family:…

瀏覽器自動化操作標準--WebDriver

WebDriver是一個瀏覽器遠程控制協議&#xff0c;是一個既定標準&#xff0c;它本身的內容非常豐富&#xff0c;本文不可能全部介紹&#xff0c;本文僅粗略帶大家了解一下WebDriver的部分內容以及一個小的實際應用。想深入了解的請參考W3C文檔WebDriver. 問題背景 開發的同學都知…

versa max_如何從Mac(和Vice Versa)打開或關閉iPhone的Safari選項卡

versa maxMany of us are familiar with this scenario: you’re looking something up on our iPhone, find exactly what we’re looking for, but then have to put our phone away to attend to something else. Later, while working on your Mac, you want to continue w…

【nuxtjs 指南】解決nuxtjs本地開發跨域和防止路由與api沖突問題

目前vue很火&#xff0c;大部分開發者把vue當做框架首選&#xff0c;然而spa是對搜素引擎很不友好&#xff0c;就會想到ssr&#xff0c;在vue社區nuxtjs完美的解決了這個問題&#xff0c;目前nuxt還不算太成熟&#xff0c;當然對于新手坑比較多&#xff0c;當我們確定使用了這個…

WPF效果第二百零五篇之自定義導航控件

前面摸索了一下會簡單玩耍自定義控件了;今天再次分享一下N年前想要在GIS實現的一個導航控件;來看看最終實現的效果:1、先來看看前臺xaml布局:2、后臺路由事件就參照上一篇快捷方式3、關鍵依賴屬性的回調觸發路由事件:4、內部Arc的MouseDown事件觸發路由事件:private void Arc_M…

python3用list實現棧

工作中遇到的需求&#xff0c;****代表標簽數據別的信息&#xff1a; D01  ********  1  ******** D01  ********  2  ******** D01  ********  3  ******** D01  ********  4  ******** D02  ********  1  ******** D02  ********  2  **…

powershell 腳本運行策略,參數....

1.運行策略 Powershell一般初始化情況下都會禁止腳本執行。腳本能否執行取決于Powershell的執行策略。 PS E:> Get-ExecutionPolicy Restricted PS E:> Set-ExecutionPolicy UnRestricted 2.直接運行 PS E:> "Hello,Powershell Script" > MyScript.ps…

linux每日命令(5):mkdir命令

閱讀目錄(Content)1&#xff0e;命令格式&#xff1a;2&#xff0e;命令功能&#xff1a;3&#xff0e;命令參數&#xff1a;4&#xff0e;命令實例&#xff1a;1&#xff1a;創建一個空目錄2&#xff1a;遞歸創建多個目錄3&#xff1a;創建權限為777的目錄4&#xff1a;創建新…

mac命令行將輸出寫入文件_如何在Linux中使用命令行將PDF文件轉換為可編輯文本...

mac命令行將輸出寫入文件There are various reasons why you might want to convert a PDF file to editable text. Maybe you need to revise an old document and all you have is the PDF version of it. Converting PDF files in Windows is easy, but what if you’re usi…

Windows Socket和Linux Socket編程的區別

2019獨角獸企業重金招聘Python工程師標準>>> 1、一些常用函數的移植 http://www.vckbase.com/document/viewdoc/?id1586 2、網絡 socket相關程序從Windows移植到Linux下需要注意的: 1)頭文件 Windows下winsock.h/winsock2.h Linux下sys/socket.h 錯誤處理&…

使用 C# 開發的現代輕量級 Windows 文本編輯器

你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;實用的工具和組件&#xff0c;希望對您有用&#xff01;Notepads 是一個具有簡約設計的現代化輕量級文本編輯器&#xff0c;在 github 上開源&#xff0c;由微軟大佬 Jiaqi Liu 開發。開發背…

分布式壓測系列之Jmeter4.0第一季

1&#xff09;Jmeter4.0介紹 jmeter是個純java編寫的開源壓測工具&#xff0c;apache旗下的開源軟件&#xff0c;一開始是設計為web測試的軟件&#xff0c;由于發展迅猛&#xff0c;現在可以壓測許多協議比如&#xff1a;http、https、soap、ftp、database數據庫、LDAP 輕量目…

powershell 查看系統設備\device status

查看設備 $allDevice"C:\Data\soundDevAll.txt" (Get-WmiObject -Class Win32_SoundDevice).Name|Out-File $allDevice device status $deviceInfoGet-WmiObject Win32_PnPEntity| select Name, Status | where {$_.Name -like "$deviceName"} $set…

Fish Shell 使用筆記

安裝Fish Shell brew install fish 安裝Oh My Fish curl -L https://get.oh-my.fish | fish 安裝Fisher curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish 配置 autojump clone autojump git clone https://github.com/wting/autojum…

Entity Framework Core 7中高效地進行批量數據插入

因為之前的版本中&#xff0c;EF Core無法實現高效地批量插入、修改、刪除數據&#xff0c;所以我開發了Zack.EFCore.Batch這個開源項目&#xff0c;比較受大家的歡迎&#xff0c;獲得了400多個star。從.NET 7開始&#xff0c;微軟在Entity Framework Core 7內置了對高效地批量…

Hive學習之路 (一)Hive初識

Hive 簡介 什么是Hive 1、Hive 由 Facebook 實現并開源 2、是基于 Hadoop 的一個數據倉庫工具 3、可以將結構化的數據映射為一張數據庫表 4、并提供 HQL(Hive SQL)查詢功能 5、底層數據是存儲在 HDFS 上 6、Hive的本質是將 SQL 語句轉換為 MapReduce 任務運行 7、使不熟悉 MapR…