国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)之排序算法

這篇具有很好參考價值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)之排序算法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

在數(shù)據(jù)結(jié)構(gòu)中,常見的排序算法有以下幾種:

  1. 冒泡排序(Bubble Sort):通過比較相鄰元素并交換它們的位置,每輪將最大(或最?。┑脑孛芭莸侥┪?,重復(fù)執(zhí)行直到排序完成。
function bubbleSort(arr) {
  const n = arr.length;
  for (let i = 0; i < n - 1; i++) {
    for (let j = 0; j < n - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
      }
    }
  }
  return arr;
}

const arr = [64, 34, 25, 12, 22, 11, 90];
console.log(bubbleSort(arr)); // Output: [11, 12, 22, 25, 34, 64, 90]

特點(diǎn):簡單易懂,但對于大型數(shù)據(jù)集效率較低。
時間復(fù)雜度:
最優(yōu)情況:O(n)(當(dāng)數(shù)組已經(jīng)排序好時)。
平均情況:O(n^2)。
最壞情況:O(n^2)。

  1. 插入排序(Insertion Sort):將數(shù)組分為已排序和未排序兩部分,每次從未排序部分選擇一個元素插入到已排序部分的正確位置,重復(fù)執(zhí)行直到排序完成。
function insertionSort(arr) {
  const n = arr.length;
  for (let i = 1; i < n; i++) {
    let key = arr[i];
    let j = i - 1;
    while (j >= 0 && arr[j] > key) {
      arr[j + 1] = arr[j];
      j--;
    }
    arr[j + 1] = key;
  }
  return arr;
}

const arr = [64, 34, 25, 12, 22, 11, 90];
console.log(insertionSort(arr)); // Output: [11, 12, 22, 25, 34, 64, 90]

特點(diǎn):適用于小型數(shù)據(jù)集和部分有序數(shù)組。
時間復(fù)雜度:
最優(yōu)情況:O(n)(當(dāng)數(shù)組已經(jīng)排序好時)。
平均情況:O(n^2)。
最壞情況:O(n^2)。

  1. 選擇排序(Selection Sort):每輪從未排序部分選擇最?。ɑ蜃畲螅┑脑?,將其與未排序部分的首元素交換,重復(fù)執(zhí)行直到排序完成。
function selectionSort(arr) {
  const n = arr.length;
  for (let i = 0; i < n - 1; i++) {
    let minIdx = i;
    for (let j = i + 1; j < n; j++) {
      if (arr[j] < arr[minIdx]) {
        minIdx = j;
      }
    }
    [arr[i], arr[minIdx]] = [arr[minIdx], arr[i]];
  }
  return arr;
}

const arr = [64, 34, 25, 12, 22, 11, 90];
console.log(selectionSort(arr)); // Output: [11, 12, 22, 25, 34, 64, 90]

特點(diǎn):簡單易懂,但對于大型數(shù)據(jù)集效率較低。
時間復(fù)雜度:
最優(yōu)情況:O(n^2)。
平均情況:O(n^2)。
最壞情況:O(n^2)。

  1. 快速排序(Quick Sort):通過選取一個基準(zhǔn)元素,將數(shù)組分成比基準(zhǔn)元素小和大的兩部分,然后遞歸地對兩部分進(jìn)行排序。
function quickSort(arr) {
  if (arr.length <= 1) return arr;
  const pivot = arr[0];
  const left = [];
  const right = [];
  for (let i = 1; i < arr.length; i++) {
    if (arr[i] < pivot) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }
  return [...quickSort(left), pivot, ...quickSort(right)];
}

const arr = [64, 34, 25, 12, 22, 11, 90];
console.log(quickSort(arr)); // Output: [11, 12, 22, 25, 34, 64, 90]

特點(diǎn):高效且被廣泛使用的排序算法。
時間復(fù)雜度:
最優(yōu)情況:O(n log n)。
平均情況:O(n log n)。
最壞情況:O(n^2)。

  1. 歸并排序(Merge Sort):將數(shù)組不斷分割成較小的子數(shù)組,然后再將子數(shù)組按順序合并,重復(fù)執(zhí)行直到排序完成。
function mergeSort(arr) {
  if (arr.length <= 1) return arr;
  const mid = Math.floor(arr.length / 2);
  const left = mergeSort(arr.slice(0, mid));
  const right = mergeSort(arr.slice(mid));
  return merge(left, right);
}

function merge(left, right) {
  const mergedArr = [];
  let leftIdx = 0;
  let rightIdx = 0;
  while (leftIdx < left.length && rightIdx < right.length) {
    if (left[leftIdx] < right[rightIdx]) {
      mergedArr.push(left[leftIdx]);
      leftIdx++;
    } else {
      mergedArr.push(right[rightIdx]);
      rightIdx++;
    }
  }
  return [...mergedArr, ...left.slice(leftIdx), ...right.slice(rightIdx)];
}

const arr = [64, 34, 25, 12, 22, 11, 90];
console.log(mergeSort(arr)); // Output: [11, 12, 22, 25, 34, 64, 90]

特點(diǎn):穩(wěn)定的排序算法,適用于大型數(shù)據(jù)集。
時間復(fù)雜度:
最優(yōu)情況:O(n log n)。
平均情況:O(n log n)。
最壞情況:O(n log n)。

  1. 堆排序(Heap Sort):利用二叉堆(最大堆或最小堆)的特性進(jìn)行排序,將堆頂元素與最后一個元素交換,然后重建堆,重復(fù)執(zhí)行直到排序完成。
function heapSort(arr) {
  const n = arr.length;
  for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {
    heapify(arr, n, i);
  }
  for (let i = n - 1; i >= 0; i--) {
    [arr[0], arr[i]] = [arr[i], arr[0]];
    heapify(arr, i, 0);
  }
  return arr;
}

function heapify(arr, n, i) {
  let largest = i;
  const left = 2 * i + 1;
  const right = 2 * i + 2;
  if (left < n && arr[left] > arr[largest]) {
    largest = left;
  }
  if (right < n && arr[right] > arr[largest]) {
    largest = right;
  }
  if (largest !== i) {
    [arr[i], arr[largest]] = [arr[largest], arr[i]];
    heapify(arr, n, largest);
  }
}

const arr = [64, 34, 25, 12, 22, 11, 90];
console.log(heapSort(arr)); // Output: [11, 12, 22, 25, 34, 64, 90]

特點(diǎn):高效的原地排序算法。
時間復(fù)雜度:
最優(yōu)情況:O(n log n)。
平均情況:O(n log n)。
最壞情況:O(n log n)。

  1. 希爾排序(Shell Sort):是插入排序的一種改進(jìn)算法,通過分組進(jìn)行插入排序,逐漸縮小分組間隔,直到分組間隔為1。
function shellSort(arr) {
  const n = arr.length;
  for (let gap = Math.floor(n / 2); gap > 0; gap = Math.floor(gap / 2)) {
    for (let i = gap; i < n; i++) {
      let temp = arr[i];
      let j;
      for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
        arr[j] = arr[j - gap];
      }
      arr[j] = temp;
    }
  }
  return arr;
}

const arr = [64, 34, 25, 12, 22, 11, 90];
console.log(shellSort(arr)); // Output: [11, 12, 22, 25, 34, 64, 90]

特點(diǎn):插入排序的改進(jìn)版本,適用于中等大小的數(shù)據(jù)集。
時間復(fù)雜度:
最優(yōu)情況:O(n log^2 n)(取決于步長序列)。
平均情況:取決于步長序列。
最壞情況:取決于步長序列。

  1. 計(jì)數(shù)排序(Counting Sort):適用于一定范圍內(nèi)的整數(shù)排序,通過統(tǒng)計(jì)每個元素出現(xiàn)的次數(shù),然后計(jì)算每個元素的位置,重復(fù)執(zhí)行直到排序完成。
function countingSort(arr) {
  const n = arr.length;
  let max = Math.max(...arr);
  let min = Math.min(...arr);
  const range = max - min + 1;
  const count = Array(range).fill(0);
  const output = Array(n);

  for (let i = 0; i < n; i++) {
    count[arr[i] - min]++;
  }

  for (let i = 1; i < range; i++) {
    count[i] += count[i - 1];
  }

  for (let i = n - 1; i >= 0; i--) {
    output[count[arr[i] - min] - 1] = arr[i];
    count[arr[i] - min]--;
  }

  for (let i = 0; i < n; i++) {
    arr[i] = output[i];
  }

  return arr;
}

const arr = [64, 34, 25, 12, 22, 11, 90];
console.log(countingSort(arr)); // Output: [11, 12, 22, 25, 34, 64, 90]

特點(diǎn):適用于小范圍整數(shù)排序。
時間復(fù)雜度:O(n + k),其中 n 是輸入數(shù)組元素個數(shù),k 是輸入范圍大小。

  1. 桶排序(Bucket Sort):將元素根據(jù)一定規(guī)則放入不同的桶中,每個桶內(nèi)部進(jìn)行排序,然后按順序合并桶內(nèi)的元素,重復(fù)執(zhí)行直到排序完成。
function bucketSort(arr, bucketSize = 5) {
  if (arr.length === 0) return arr;

  const max = Math.max(...arr);
  const min = Math.min(...arr);
  const bucketCount = Math.floor((max - min) / bucketSize) + 1;
  const buckets = Array(bucketCount).fill().map(() => []);

  for (let i = 0; i < arr.length; i++) {
    const bucketIndex = Math.floor((arr[i] - min) / bucketSize);
    buckets[bucketIndex].push(arr[i]);
  }

  arr.length = 0;
  for (let i = 0; i < buckets.length; i++) {
    insertionSort(buckets[i]);
    arr.push(...buckets[i]);
  }

  return arr;
}

const arr = [64, 34, 25, 12, 22, 11, 90];
console.log(bucketSort(arr)); // Output: [11, 12, 22, 25, 34, 64, 90]

特點(diǎn):適用于均勻分布的數(shù)據(jù)。
時間復(fù)雜度:O(n + k),其中 n 是輸入數(shù)組元素個數(shù),k 是桶的個數(shù)。

  1. 基數(shù)排序(Radix Sort):按照位數(shù)將元素分配到不同的桶中,然后按順序合并桶內(nèi)的元素,重復(fù)執(zhí)行直到所有位數(shù)排序完成。
function radixSort(arr) {
  const max = Math.max(...arr);
  const maxLength = String(max).length;
  let bucket = Array.from({ length: 10 }, () => []);

  for (let i = 0; i < maxLength; i++) {
    for (let j = 0; j < arr.length; j++) {
      const digit = Math.floor(arr[j] / 10 ** i) % 10;
      bucket[digit].push(arr[j]);
    }
    arr.length = 0;
    for (let k = 0; k < bucket.length; k++) {
      arr.push(...bucket[k]);
      bucket[k].length = 0;
    }
  }

  return arr;
}

const arr = [64, 34, 25, 12, 22, 11, 90];
console.log(radixSort(arr)); // Output: [11, 12, 22, 25, 34, 64, 90]

特點(diǎn):適用于數(shù)字位數(shù)相同的整數(shù)排序。
時間復(fù)雜度:O(d * (n + k)),其中 d 是最大數(shù)字的位數(shù),n 是輸入數(shù)組元素個數(shù),k 是輸入范圍大小。

每種排序算法都有不同的時間復(fù)雜度和適用場景。在實(shí)際應(yīng)用中,根據(jù)數(shù)據(jù)規(guī)模和性能要求選擇合適的排序算法是很重要的。文章來源地址http://www.zghlxwxcb.cn/news/detail-615897.html

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)之排序算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)——排序算法——?dú)w并排序

    數(shù)據(jù)結(jié)構(gòu)——排序算法——?dú)w并排序

    在第二個列表向第一個列表逐個插入的過程中,由于第二個列表已經(jīng)有序,所以后續(xù)插入的元素一定不會在前面插入的元素之前。在逐個插入的過程中,每次插入時,只需要從上次插入的位置開始,繼續(xù)向后尋找插入位置即可。這樣一來,我們最多只需要將兩個有序數(shù)組遍歷

    2024年02月09日
    瀏覽(34)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】十大經(jīng)典排序算法-插入排序

    【數(shù)據(jù)結(jié)構(gòu)與算法】十大經(jīng)典排序算法-插入排序

    ?? 個人博客: www.hellocode.top ?? Java知識導(dǎo)航: Java-Navigate ?? CSDN: HelloCode. ?? 知乎 :HelloCode ?? 掘金 :HelloCode ?如有問題,歡迎指正,一起學(xué)習(xí)~~ 插入排序(Insertion Sort)是一種簡單直觀的排序算法,其基本思想是將一個記錄插入到已排好序的有序序列中,直到所有記錄

    2024年02月13日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】十大經(jīng)典排序算法-快速排序

    【數(shù)據(jù)結(jié)構(gòu)與算法】十大經(jīng)典排序算法-快速排序

    ?? 個人博客: www.hellocode.top ?? Java知識導(dǎo)航: Java-Navigate ?? CSDN: HelloCode. ?? 知乎 :HelloCode ?? 掘金 :HelloCode ?如有問題,歡迎指正,一起學(xué)習(xí)~~ 快速排序(Quick Sort)是一種高效的排序算法,是對冒泡排序的優(yōu)化。它采用分治法(Divide and Conquer)的思想,將待排序序列

    2024年02月13日
    瀏覽(24)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】十大經(jīng)典排序算法-希爾排序

    【數(shù)據(jù)結(jié)構(gòu)與算法】十大經(jīng)典排序算法-希爾排序

    ?? 個人博客: www.hellocode.top ?? Java知識導(dǎo)航: Java-Navigate ?? CSDN: HelloCode. ?? 知乎 :HelloCode ?? 掘金 :HelloCode ?如有問題,歡迎指正,一起學(xué)習(xí)~~ 希爾排序是一種插入排序的改進(jìn)版本,旨在解決插入排序在處理大規(guī)模數(shù)據(jù)時的效率問題。通過將數(shù)組分為多個子序列并對

    2024年02月12日
    瀏覽(30)
  • 數(shù)據(jù)結(jié)構(gòu)和算法筆記4:排序算法-歸并排序

    數(shù)據(jù)結(jié)構(gòu)和算法筆記4:排序算法-歸并排序

    歸并排序算法完全遵循分治模式。直觀上其操作如下: 分解:分解待排序的n個元素的序列成各具n/2個元素的兩個子序列。 解決:使用歸并排序遞歸地排序兩個子序列。 合并:合并兩個已排序的子序列以產(chǎn)生已排序的答案。 我們直接來看例子理解算法的過程,下面是要排序

    2024年01月21日
    瀏覽(36)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】十大經(jīng)典排序算法-冒泡排序

    【數(shù)據(jù)結(jié)構(gòu)與算法】十大經(jīng)典排序算法-冒泡排序

    ?? 個人博客: www.hellocode.top ?? Java知識導(dǎo)航: Java-Navigate ?? CSDN: HelloCode. ?? 掘金 :HelloCode ?? 知乎 :HelloCode ?如有問題,歡迎指正,一起學(xué)習(xí)~~ 冒泡排序(Bubble Sort)是一種簡單的排序算法,它通過重復(fù)地交換相鄰元素的位置來將最大(或最?。┑脑刂鸩健懊芭荨钡?/p>

    2024年02月14日
    瀏覽(26)
  • 數(shù)據(jù)結(jié)構(gòu)——排序算法之快速排序

    數(shù)據(jù)結(jié)構(gòu)——排序算法之快速排序

    ? ??個人主頁: 日刷百題 系列專欄 : 〖C/C++小游戲〗 〖Linux〗 〖數(shù)據(jù)結(jié)構(gòu)〗 ? 〖C語言〗 ?? 歡迎各位 → 點(diǎn)贊 ??+ 收藏 ??+ 留言 ??? ? ? 快速排序是Hoare于1962年提出的一種二叉樹結(jié)構(gòu)的交換排序方法。 基本思想: 任取待排序元素序列中 的某元素作為基準(zhǔn)值,按照

    2024年01月21日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】排序算法(選擇排序,冒泡排序,插入排序,希爾排序)

    基本概念這了就不浪費(fèi)時間解釋了,這四種都是很簡單的排序方式,本專欄后續(xù)文章會出歸并排序,計(jì)數(shù)排序,快速排序,堆排序,桶排序等排序算法,今天這篇文章中給出選擇排序,冒泡排序,插入排序和希爾排序的實(shí)現(xiàn); 如果發(fā)現(xiàn)文章中有錯誤,還請大家指出來,我會非

    2024年02月15日
    瀏覽(97)
  • 數(shù)據(jù)結(jié)構(gòu)與算法-排序算法

    數(shù)據(jù)結(jié)構(gòu)與算法-排序算法

    遞歸將整個函數(shù)的調(diào)用過程 調(diào)用過程 如何在CSDN博客中插入公式和各種符號 類似二叉樹的后續(xù)遍歷 遞歸行為和遞歸行為時間復(fù)雜度的估算 master 公式 : T ( n ) = a × T ( n b ) + O ( n d ) T(n) = a times T (frac{n}) + O(n^d) T ( n ) = a × T ( b n ? ) + O ( n d ) T ( n ) T(n) T ( n ) : 母問題的規(guī)模

    2024年02月15日
    瀏覽(22)
  • 算法 數(shù)據(jù)結(jié)構(gòu) 遞歸插入排序 java插入排序 遞歸求解插入排序算法 如何用遞歸寫插入排序 插入排序動圖 插入排序優(yōu)化 數(shù)據(jù)結(jié)構(gòu)(十)

    算法 數(shù)據(jù)結(jié)構(gòu) 遞歸插入排序 java插入排序 遞歸求解插入排序算法 如何用遞歸寫插入排序 插入排序動圖 插入排序優(yōu)化 數(shù)據(jù)結(jié)構(gòu)(十)

    1. 插入排序(insertion-sort): ????????????????????????????????????????? 是一種簡單直觀的排序算法。它的工作原理是通過構(gòu)建有序序列,對于未排序數(shù)據(jù),在已排序序列中從后向前掃描,找到相應(yīng)位置并插入 ??? 算法穩(wěn)定性: ?????????????????

    2024年02月09日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包