javascript: Sorting Algorithms

/**
* file Sort.js
* ide:vscode  JavaScript Sorting Algorithms
* 插件:IntelliSense,JSDoc,CodeLens,Debugger for Chrome,
静态代码检查:ESLint,JSHint,Flow Langugae Support,StandardJS-JavaScript Standard Style,
koroFileHeader(文件头注释),
测试插件:Mocha sidebar,Mocha Test Explorer,Jest
Path Intellisense,Import Cost,Quokka.js,Code Metrics,Javascript Booster,Turbo Console Log
* https://www.programiz.com/dsa/counting-sort
* https://www.geeksforgeeks.org/sorting-algorithms/
* https://thedukh.com/2021/02/javascript-sorting-algorithms-explained-radix-sort/
* https://www.epubit.com/
* https://www.ituring.com.cn/
  
*/
  
  
  
/**
 * Description placeholder 1. Bubble Sort冒泡排序法
 * @date 10/23/2023 - 2:47:05 PM
 *
 * @param {*} arry 需要排序的整数數組
 * @param {*} nszie 数组长度
 * @returns {*} 返回排序后结果的数组
 */
  
function BubbleSort(arry, nszie)
{
    var i, j, temp;
    var swapped;
    for (i = 0; i < nszie - 1; i++)
    {
        swapped = false;
        for (j = 0; j < nszie - i - 1; j++)
        {
            if (arry[j] > arry[j + 1])
            {
                // Swap arry[j] and arry[j+1]
                temp = arry[j];
                arry[j] = arry[j + 1];
                arry[j + 1] = temp;
                swapped = true;
            }
        }
    
        // IF no two elements were
        // swapped by inner loop, then break
        if (swapped == false)
        break;
    }
       
    return arry
}
/**
 * 交换操作
 * @param {*} arry 数组
 * @param {*} xp
 * @param {*} yp
 */
function swap(arry,xp, yp)
{
    var temp = arry[xp];
    arry[xp] = arry[yp];
    arry[yp] = temp;
}
 /**
  * 2 选择排序 Selection Sort
  * @param {*} arry  需要排序的整数數組
  * @param {*} nsize 数组长度
  * @returns  返回排序后结果的数组
  */
function SelectionSort(arry,  nsize)
{
    var i, j, min_idx;
    
    // One by one move boundary of unsorted subarray
    for (i = 0; i < nsize-1; i++)
    {
        // Find the minimum element in unsorted array
        min_idx = i;
        for (j = i + 1; j < nsize; j++)
        if (arry[j] < arry[min_idx])
            min_idx = j;
    
        // Swap the found minimum element with the first element
        swap(arry,min_idx, i);
    }
    return arry;
}
  
/**
 * 3 插入排序 Insertion Sort
  * @param {*} arry  需要排序的整数數組
  * @param {*} nsize 数组长度
  * @returns  返回排序后结果的数组
 */
function InsertionSort(arry, nsize)
{
    let i, key, j;
    for (i = 1; i < nsize; i++)
    {
        key = arry[i];
        j = i - 1;
      
        /* Move elements of arr[0..i-1], that are
        greater than key, to one position ahead
        of their current position */
        while (j >= 0 && arry[j] > key)
        {
            arry[j + 1] = arry[j];
            j = j - 1;
        }
        arry[j + 1] = key;
    }
    return arry;
}
  
/**
 * 整数数组转字符串显示
 * @param {*} arry 需要打印的数组
 * @param {*} nsize 数组的长度
 *
 * @returns 返回打印格式字符串
 */
function stringArray(arry, nsize)
{
       
    var myStr=new Array();
   var i;
  for (i = 0; i < nsize; i++)
  {
       //getstr=getstr+arry[i].toString() + "<br/>";
      myStr[i]=arry[i];
      console.log(arry[i]);
  }
   console.log(myStr.join("<br/>"));
    return myStr.join(" <br/>");
  //console.log(arry);
 /* var myStr=new Array();
  var getstr="";
  */
    /*
  var i;
  for (i = 0; i < nsize; i++)
  {
      getstr=getstr+arry[i] + " ";
      myStr[i]=arry[i].toString();
      console.log(myStr[i]);
  }
  return getstr;//myStr.join(" ");*/
}
   
//
   
// Merges two subarrays of arr[].
// First subarray is arr[l..m]
// Second subarray is arr[m+1..r]
/**
 *
 * @param {*} arry 需要打印的数组
 * @param {*} indexStart
 * @param {*} m
 * @param {*} indexEnd
 */
function merge(arry, indexStart, m, indexEnd)
{
    var n1 = m - indexStart + 1;
    var n2 = indexEnd - m;
    // Create temp arrays
    var L = new Array(n1);
    var R = new Array(n2);
    // Copy data to temp arrays L[] and R[]
    for (var i = 0; i < n1; i++)
        L[i] = arry[indexStart + i];
    for (var j = 0; j < n2; j++)
        R[j] = arry[m + 1 + j];
   
    // Merge the temp arrays back into arry[l..r]
    // Initial index of first subarray
    var i = 0;
    // Initial index of second subarray
    var j = 0;
    // Initial index of merged subarray
    var k = indexStart;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arry[k] = L[i];
            i++;
        }
        else {
            arry[k] = R[j];
            j++;
        }
        k++;
    }
    // Copy the remaining elements of
    // L[], if there are any
    while (i < n1) {
        arry[k] = L[i];
        i++;
        k++;
    }
    // Copy the remaining elements of
    // R[], if there are any
    while (j < n2) {
        arry[k] = R[j];
        j++;
        k++;
    }
}
   
// l is for left index and r is
// right index of the sub-array
// of arr to be sorted
/**
 * 4 合并排序 Merge Sort
 * @param {*} arry 需要排序的整数數組
 * @param {*} indexStart  数组索引值 0
 * @param {*} indexEnd  索引值最大值 数组长度-1
 * @returns 返回排序好的数组
 */
function mergeSort(arry,indexStart, indexEnd){
    if(indexStart>=indexEnd){
        return;
    }
    var m =indexStart+ parseInt((indexEnd-indexStart)/2);
    mergeSort(arry,indexStart,m);
    mergeSort(arry,m+1,indexEnd);
    merge(arry,indexStart,m,indexEnd);
    return arry;
}
  
  
/**
 * Function to partition the array and return the partition index
 * @param {*} arry 需要排序的整数數組
 * @param {*} low 数组索引值 0
 * @param {*} high 索引值最大值 数组长度-1
 * @returns
 */
function quickPartition(arry, low, high) {
    // Choosing the pivot
    let pivot = arry[high];
     
    // Index of smaller element and indicates the right position of pivot found so far
    let i = low - 1;
     
    for (let j = low; j <= high - 1; j++) {
        // If current element is smaller than the pivot
        if (arry[j] < pivot) {
            // Increment index of smaller element
            i++;
            [arry[i], arry[j]] = [arry[j], arry[i]]; // Swap elements
        }
    }
     
    [arry[i + 1], arry[high]] = [arry[high], arry[i + 1]]; // Swap pivot to its correct position
    return i + 1; // Return the partition index
}
   
/**
* The main function that implements QuickSort
* 5 Quick Sort 快速排序
 * @param {*} arry 需要排序的整数數組
 * @param {*} low 数组索引值 0
 * @param {*} high  索引值最大值 数组长度-1
 * @returns  返回排序好的数组
 */
function quickSort(arry, low, high) {
    if (low < high) {
        // pi is the partitioning index, arr[pi] is now at the right place
        let pi = quickPartition(arry, low, high);
     
        // Separately sort elements before partition and after partition
        quickSort(arry, low, pi - 1);
        quickSort(arry, pi + 1, high);
    }
    return arry;
}
  
/**
 * of Heap Sort
 * 6 堆排序 Heap Sort
 * @param {*} arry 需要排序的整数數組
 * @returns 返回排序好的数组
 */
function heapSort( arry)
    {
        var N = arry.length;
   
        // Build heap (rearrange array)
        for (var i = Math.floor(N / 2) - 1; i >= 0; i--)
            heapify(arry, N, i);
   
        // One by one extract an element from heap
        for (var i = N - 1; i > 0; i--) {
            // Move current root to end
            var temp = arry[0];
            arry[0] = arry[i];
            arry[i] = temp;
   
            // call max heapify on the reduced heap
            heapify(arry, i, 0);
        }
          
        return arry;
 }
   
/**
* To heapify a subtree rooted with node i which is
* an index in arr[]. n is size of heap
* @param {*} arry 需要排序的整数數組
* @param {*} N 数组长度
* @param {*} i 数组索引值 0
 */
function heapify(arry, N, i)
{
        var largest = i; // Initialize largest as root
        var l = 2 * i + 1; // left = 2*i + 1
        var r = 2 * i + 2; // right = 2*i + 2
   
        // If left child is larger than root
        if (l < N && arry[l] > arry[largest])
            largest = l;
   
        // If right child is larger than largest so far
        if (r < N && arry[r] > arry[largest])
            largest = r;
   
        // If largest is not root
        if (largest != i) {
            var swap = arry[i];
            arry[i] = arry[largest];
            arry[largest] = swap;
   
            // Recursively heapify the affected sub-tree
            heapify(arry, N, largest);
        }
}
  
/**
 * 7 Counting Sort 计数排序
 * @param {*} arry 需要排序的整数數組
 * @param {*} min 数组中最小的值
 * @param {*} max 数组中最大的值
 * @returns 返回排序好的数组
 */
function countingSort(arry, min, max) {
    let j = 0;
    let supplementary = [];
      
    for (let i = min; i <= max; i++) {
        supplementary[i] = 0;
    }
      
    for (let i=0; i < arry.length; i++) {
        supplementary[arry[i]] += 1;
    }
         
    for (let i = min; i <= max; i++) {
        while (supplementary[i] > 0) {
            arry[j++] = i;
            supplementary[i] -= 1;
        }
    }
    return arry;
}
  
  
/**
 * 7 Counting Sort 计数排序
 * @param {*} arry 需要排序的整数數組
 * @returns 返回排序好的数组
 */
function duCountingSort(arry) {
    let j = 0;
    let supplementary = [];
    min=getArrayMin(arry);
    max=getArrayMax(arry);
    for (let i = min; i <= max; i++) {
        supplementary[i] = 0;
    }
      
    for (let i=0; i < arry.length; i++) {
        supplementary[arry[i]] += 1;
    }
         
    for (let i = min; i <= max; i++) {
        while (supplementary[i] > 0) {
            arry[j++] = i;
            supplementary[i] -= 1;
        }
    }
    return arry;
}
  
  
  
/**
 * 求得数组中最大值
 * @param {*} arry 整数數組
 * @param {*} nszie 数组长度
 * @returns 返回数组中的最大值
 */
function getMax(arry,nszie)
{
    let mx = arry[0];
        for (let i = 1; i < nszie; i++)
            if (arry[i] > mx)
                mx = arry[i];
        return mx;
}
  
/**
 * 求得数组中最小值
 * @param {*} arry 整数數組
 * @returns 返回数组中的最小值
 */
function getArrayMin(arry){
    var min = arry[0];
    for(var i = 1, ilen = arry.length; i < ilen; i+=1) {
        if(arry[i] < min) {
            min = arry[i];
        }
    }
    return min;
}
/**
 * 求得数组中最大值
 * @param {*} arry 整数數組
 * @returns 返回数组中的最大值
 */
function getArrayMax(arry) {
    var max = arry[0];
    for(var i = 1,ilen = arry.length; i < ilen; i++) {
        if(arry[i] > max) {
            max = arry[i];
        }
    }
    return max;
}
  
/**
 *
 * @param {*} arry
 * @param {*} nszie
 * @param {*} exp
 */
function radixCountSort(arry,nszie,exp)
{
    let output = new Array(nszie); // output array
        let i;
        let x;
        let count = new Array(10);
        for(let i=0;i<10;i++)
            count[i]=0;
     
        // Store count of occurrences in count[]  这里有问题
        for (i = 0; i < nszie; i++)
        {
            let s=arry[i]/exp;
            x = Math.floor(s) % 10;
                
        }
        count[x]++;
                           
              
     
        // Change count[i] so that count[i] now contains
        // actual position of this digit in output[]
        for (i = 1; i < 10; i++)
            count[i] += count[i - 1];
     
        // Build the output array
        for (i = nszie - 1; i >= 0; i--) {
            output[count[x] - 1] = arry[i];
            count[x]--;
        }
     
        // Copy the output array to arr[], so that arr[] now
        // contains sorted numbers according to current digit
        for (i = 0; i < nszie; i++)
        arry[i] = output[i];
}
    
/**
 * The main function to that sorts arr[] of size n using
   8 Radix Sort 基数排序 Radix Sort 有问题
 * @param {*} arry 需要排序的整数數組
 * @param {*} nszie 数组长度
 */
function radixsort(arry,nszie)
{
    // Find the maximum number to know number of digits
        let m = getMax(arry, nszie);
     
        // Do counting sort for every digit. Note that
        // instead of passing digit number, exp is passed.
        // exp is 10^i where i is current digit number
        for (let exp = 1; Math.floor(m / exp) > 0; exp *= 10)
            radixCountSort(arry, nszie, exp);
  
    return arry;
}
  
/**
 *
 * @param {*} arry
 * @returns
 */
function getBiggestDigitCount(arry) {
    let maxDigits = 0;
    for (let i = 0; i < arry.length; i++) {
      maxDigits = Math.max(maxDigits, arry[i].toString().length);
    }
    return maxDigits;
  }
  
/**
 *
 * @param {*} arry
 * @param {*} i
 * @returns
 */
  function getDigitAtPlace(arry, i) {
    return arry.toString().split("").reverse()[i] || 0;
  }
  
  /**
   * 8 Radix Sort 基数排序
   * @param {*} arry 需要排序的整数數組
   * @returns 返回排序后结果的数组
   */
  function DuRadixSort(arry) {
    let maxDigits = getBiggestDigitCount(arry);
    for (let i = 0; i < maxDigits; i++) {
      let bucketArray = Array.from({ length: 10 }, () => []);
      for (let j = 0; j < arry.length; j++) {
          let digit = getDigitAtPlace(arry[j], i);
          bucketArray[digit].push(arry[j]);
      }
      arry = [].concat(...bucketArray);
    }
    return arry;
  }
  
/**
 * 9. Bucket Sort 桶排序
 * using bucket sort
 * @param {*} arry 需要排序的整数數組
 * @param {*} nszie 数组长度
 * @returns 返回排序后结果的数组
 */
function bucketSort(arry,nszie)
{
    if (nszie <= 0)
            return;
    
        // 1) Create n empty buckets     
        let buckets = new Array(nszie);
    
        for (let i = 0; i < nszie; i++)
        {
            buckets[i] = [];
        }
    
        // 2) Put array elements in different buckets
        for (let i = 0; i < nszie; i++) {
            let idx = arry[i] * nszie;
            let flr = Math.floor(idx);
            //buckets[flr].push(arry[i]);  //有问题
            buckets[flr].push(arry[i]);
        }
    
        // 3) Sort individual buckets
        for (let i = 0; i < nszie; i++) {
            buckets[i].sort(function(a,b){return a-b;});
        }
    
        // 4) Concatenate all buckets into arr[]
        let index = 0;
        for (let i = 0; i < nszie; i++) {
            for (let j = 0; j < buckets[i].length; j++) {
                arry[index++] = buckets[i][j];
            }
        }
  
        return arry;
}
/**
 * 9. Bucket Sort 桶排序
 * @param {*} arry 需要排序的整数數組
 * @returns 返回排序后结果的数组
 */
function duBubbleSort(arry) {
    let swapHappened;
    for (let i = arry.length; i > 0; i--) {
      swapHappened = true;
      for (let j = 0; j < i - 1; j++) {
        if (arry[j] > arry[j + 1]) {
          [arry[j], arry[j + 1]] = [arry[j + 1], arry[j]];
          swapHappened = false;
        }
      }
      if (swapHappened) {
        break;
      }
    }
    return arry;
  }
  
  /**
   *
   * @param {*} arry
   * @returns
   */
  function bingoSort(arry) {
    let n=arry.length;
    let bingo = arry[0];
    let nextBingo = arry[0];
       
    // For finding the maximum and minimum element of
    // the Array
    for (let i = 1; i < n; bingo = Math.min(bingo, arry[i]), nextBingo = Math.max(nextBingo, arry[i]), i++)
        ;
    let largestEle = nextBingo;
    let nextElePos = 0;
    while (bingo < nextBingo)
    {
       
        // Will keep the track of the element position to
        // shifted to their correct position
        let startPos = nextElePos;
        for (let i = startPos; i < n; i++) {
            if (arry[i] == bingo) {
                [arry[i], arry[nextElePos]] = [arry[nextElePos], arry[i]];
                nextElePos = nextElePos + 1;
            }
               
            // Here we are finding the next Bingo Element
            // for the next pass
            else if (arry[i] < nextBingo)
                nextBingo = arry[i];
        }
        bingo = nextBingo;
        nextBingo = largestEle;
    }
    for (let i = 0; i < arry.length; i++) {
        // console.log("arr: ",arry[i]);
    }
    return arry;
}
  
  
/**
 * 打印数组
 * @param {*} arry 需要找印的数组
 * @param {*} nsize 数组长度
 * @returns 返回打印的格式字符串
 */
function printArray(arry, nsize)
{
  var getstr="";
  var i;
  for (i = 0; i < nsize; i++)
  {
      console.log(arry[i] + " ");
      getstr=getstr+arry[i]+" ";
  }
  return getstr;
}

调用:

<!--
 * @Author: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
 * @Date: 2023-10-23 12:26:05
 * @LastEditors: error: error: git config user.name & please set dead value or install git && error: git config user.email & please set dead value or install git & please set dead value or install git
 * @LastEditTime: 2023-10-23 17:22:26
 * @FilePath: \algorithms\1.html   alt+ctrl+i 键
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
-->
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>成长开始,geovindu,涂聚文,Geovin Du Bubble Sort冒泡排序法</title>
        <meta name="Description" content="geovindu"/>
<meta name="Keywords" content="geovindu"/>
<meta name="author" content="geovindu"/>
    <script  src="js/jquery-3.6.0.js"></script>
    <script src="js/SortAlgorithm/Sort.js"></script>
    <script type="text/javascript">
   
 $(document).ready(function () {
// 1. Bubble Sort冒泡排序法
var arry = [ 64, 34, 25, 112, 220, 11, 90 ];
var  nzie= arry.length;
var duselect=SelectionSort(arry,nzie);
console.log(duselect)
var geovindu=BubbleSort(arry, nzie);
console.log(geovindu);
var inserttdu=InsertionSort(arry,nzie);
var myStr=new Array();
var i;
  for (i = 0; i < nzie; i++)
  {
       //getstr=getstr+arry[i].toString() + "<br/>";
      myStr[i]=geovindu[i].toString();
      console.log(geovindu[i].toString());
  }
  
console.log(myStr.join("<br/>"));
var du=stringArray(arry,nzie);
var du2=stringArray(duselect,nzie);
var du3=stringArray(inserttdu,nzie);
var dumergeSort=mergeSort(arry,0,nzie-1);
var du4=stringArray(dumergeSort,nzie);
console.log("mergesoft:"+dumergeSort); 
var duQuick=quickSort(arry,0,nzie-1); 
var du5=stringArray(duQuick,nzie); 
var duHeap=heapSort(arry,0,nzie-1);
var du6=stringArray(duHeap,nzie-1);
var duCounting=duCountingSort(arry);   
var du7=stringArray(duCounting,nzie);
let duarry=[170, 45, 75, 90, 802, 24, 2, 66];
var duradix=DuRadixSort(duarry);   
var du8=stringArray(duradix,nzie);
let arrdu = [0.897, 0.565,
         0.656, 0.1234,
         0.665, 0.3434];
var dubucket=duBubbleSort(arrdu);  
var du9=stringArray(dubucket,nzie);
  
var dubingo=bingoSort(arry);   
var du10=stringArray(dubingo,nzie);
console.log("bucket Sort:"+dubucket); 
console.log(du8);
console.log(du);
console.log("Bubble Sorted array: ");
  
 var getstr=printArray(arry, nzie);
console.log("str:"+getstr)
$("#txtgeovindu").html(getstr);
txtgeovindu.innerHTML = getstr;//stringArray(geovindu,nsize); 
$("#geovindu").html("1.泡冒泡排序Bubble Sorted:<br/>"+myStr.join("<br/>"));
$("#geovindu2").html(du);
$("#geovindu3").html("2.选择排序Selection Sorted:<br/>"+du2);
$("#geovindu4").html("3.插入排序Insertion Sorted:<br/>"+du3);
$("#geovindu5").html("4.合并排序 Merge Sort :<br/>"+du4);
$("#geovindu6").html("5.快速排序 Quick Sort:<br/>"+du5);
$("#geovindu6").html("6.堆排序 Heap Sort:<br/>"+du6);  
$("#geovindu7").html("7.计数排序 Counting Sort:<br/>"+du7);     
$("#geovindu8").html("8.基数排序 Radix Sort:<br/>"+du8);
$("#geovindu9").html("9.桶排序 Bucket Sort:<br/>"+du9);
$("#geovindu10").html("10.宾果排序 Bingo Sort:<br/>"+du10);
 });
    </script>
</head>
   
<body>
<textarea id="txtgeovindu" class="geovindu" name="" cols="30" rows="10"></textarea>
<div id="geovindu"></div>
<div id="geovindu2"></div>
<div id="geovindu3"></div>
<div id="geovindu4"></div>
<div id="geovindu5"></div>
<div id="geovindu6"></div>
<div id="geovindu7"></div>
<div id="geovindu8"></div>
<div id="geovindu9"></div>
<div id="geovindu10"></div>
</body>
</html>

输出:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/103322.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

某网站互动数据采集

1&#xff0c;网址 aHR0cHM6Ly9uZXdzLmZ1dHVubi5jb20vcG9zdC8zMzE4MzE1OQ2&#xff0c;找到返回互动数的请求包 3&#xff0c;采集互动数据加密信息如下 4&#xff0c;察看抓到的包&#xff0c;不难发现futu-offline-csrf-v2和futu-x-csrf-token-v2这两个参数在首页的请求中有…

基于斑马优化的BP神经网络(分类应用) - 附代码

基于斑马优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于斑马优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.斑马优化BP神经网络3.1 BP神经网络参数设置3.2 斑马算法应用 4.测试结果&#xff1a;5.M…

Python数据结构(树)

Python数据结构&#xff08;树&#xff09; 树的概念 树(英语: tree)是一种抽象数据类型ADT) 或是实作这种抽象数据类型的数据结构&#xff0c;用来模拟具有树状结构性质的数据集合。它是由n(n>1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一…

mysql 数据库 表结构生成word文档

1、背景 我们在做项目时&#xff0c;表设计文档都是非常重要的&#xff0c;可以让开发人员快速了解表与业务的关系、表之间的关系。 产品在不停迭代的过程中&#xff0c;表的结构也会有相应的变化&#xff0c;我们需要将变化更新的表设计文档中。以前我们是人工方式更新文档&…

reactNative导入excel文件

组件内导入 import {TouchableOpacity,PermissionsAndroid} from react-native; import RNFS from react-native-fs; import XLSX from xlsx; import DocumentPicker from react-native-document-picker; import {Buffer} from buffer;// 需要安装一下三个,Buffer和react-nati…

TP4057替代DP4057 500mA线性锂离子电池充电器芯片

描述 DP4057是一款完整的单节锂离子电池带电池正负极反接保护采用恒定电流/恒定电压线性充电器。其SOT封装与较少的外部元件数目使得DP4057成为便携式应用的理想选择。DP4057 可以适合USB电源和适配器电源工作。 由于采用了内部PMOSFET架构&#xff0c;加.上防倒充电路&#xf…

隧道代理 vs 普通代理:哪种更适合您的爬虫应用?

前言 随着互联网的普及&#xff0c;爬虫技术在多个领域得到广泛应用。在进行爬虫开发时&#xff0c;代理服务器是不可或缺的工具之一。代理服务器可以隐藏客户端的真实 IP 地址和位置&#xff0c;从而保护客户端的隐私&#xff0c;同时通过代理可以绕过一些网络限制和安全机制…

【JavaEE】网络编程---TCP数据报套接字编程

一、TCP数据报套接字编程 1.1 ServerSocket API ServerSocket 是创建TCP服务端Socket的API ServerSocket 构造方法&#xff1a; ServerSocket 方法&#xff1a; 1.2 Socket API Socket 是客户端Socket&#xff0c;或服务端中接收到客户端建立连接&#xff08;accept方法&…

好用的Visio绘图文件工具 VSD Viewer最新 for mac

VSD Viewer是一款可以查看Microsoft Visio绘图文件的工具&#xff0c;适用于Windows和macOS操作系统。它具有以下优点&#xff1a; 直观易用&#xff1a;VSD Viewer的用户界面非常简单直观&#xff0c;易于使用。支持多种文件格式&#xff1a;VSD Viewer支持多种Visio文件格式…

短视频矩阵系统搭建/源头----源码

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统&#xff0c;目前是全国源头独立开发)&#xff0c;开发功能大拆解分享&#xff0c;功能大拆解&#xff1a; 7大模型剪辑法&#xff08;数学阶乘&#xff…

HTML页面获取URL传递的参数值

如&#xff1a; // 查询url上链接的参数与参数值 function getQueryString(name) {var url window.location.search; // 获取URLvar pattern new RegExp("[\?\&]" name "([^\&])", "i"); // 正则匹配URLvar matcher pattern.exec(…

企业如何保护机密文件安全

企业如何保护机密文件安全&#xff0c;数据加密技术有哪些 随着公司业务的不断发展&#xff0c;公司机密文件的保护是一家公司不可忽视的问题。机密文件包含了企业的核心信息&#xff0c;如客户资料、产品方案、财务数据等。 安企神数据防泄密系统下载试用 企业数据一旦泄露…

HTTP响应

HTTP响应分为四个部分&#xff1a; 首行&#xff1a;HTTP/1.1&#xff08;首行&#xff09; 200&#xff08;状态码&#xff09; OK&#xff08;状态码描述&#xff09;header&#xff1a;空行&#xff1a;表示header的结束标记body&#xff1a;正文 HTTP状态码&#xff1a;…

MySQL-DML【数据操作语言】(图码结合)

目录 &#x1f6a9;DML的定义 &#x1f449;DML-添加数据 &#x1f393;给指定的字段添加数据 &#x1f576;️查询表数据的方式 ❗疑惑点一【Affecter rows:行数】 ❗疑惑点二【字符集问题】 &#x1f393;给全部字段添加数据 &#x1f393;批量添加数据 &#x1f…

得帆北区总经理——湛颂:得帆云iPaaS平台是满足企业集成需求的利器

后ERP时代的IT变革 在过去的许多年里&#xff0c;企业的IT发展往往都是根据各业务部门的需求而引入大量系统。十年前&#xff0c;面对制造业的客户群体&#xff0c;当他们已经引入了ERP、CRM、WMS、MES、TMS、HR、LIMS等业务系统的时候&#xff0c;我就在讲一个话题——后ERP时…

YOLOv5算法改进(20)— 如何去写YOLOv5相关的论文(包括论文阅读+规律总结+写作方法)

前言:Hello大家好,我是小哥谈。最近一直在阅读关于YOLOv5的相关论文,读着读着我发现一条可以发论文的规律,特此简单总结一下,希望能够对同学们有所启迪!🌈 前期回顾: YOLOv5算法改进(1)— 如何去改进YOLOv5算法

GitHub commit时出现 无法访问443 Operation timed out的解决办法

GitHub commit时出现 无法访问443 Operation timed out的解决办法 1.问题描述2. 环境3.解决方法4.如果上述方法不行&#xff0c;那就再试一试下面这个方法4.1 首先确认自己的网页可以打开github4.2 按照如下配置http和https代理4.2.1 找端口号 5. 参考链接 1.问题描述 当使用g…

thinkphp 解决跨域的三个方式

1. 在tp入口index.php 加上header //支持跨域 header("Access-Control-Allow-Origin:*"); header(Access-Control-Allow-Methods:*); header(Access-Control-Allow-Headers:x-requested-with, content-type,token); 2. 在route.php加上 allowCrossDomain()&#xff…

吐血整理,Jmeter服务端性能测试-线程阻塞问题案例分析(超细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Jstack打印快照…

【HarmonyOS】元服务卡片展示动态数据,并定点更新卡片数据

【关键字】 元服务卡片、卡片展示动态数据、更新卡片数据 【写在前面】 本篇文章主要介绍开发元服务卡片时&#xff0c;如何实现卡片中动态显示数据功能&#xff0c;并实现定时数据刷新。本篇文章通过实现定时刷新卡片中日期数据为例&#xff0c;讲述展示动态数据与更新数据功…