亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript實(shí)現(xiàn)的九種排序算法

 更新時(shí)間:2019年03月04日 10:35:53   作者:飛鴿傳書  
這篇文章主要給大家介紹了關(guān)于利用JavaScript實(shí)現(xiàn)的九種排序算法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

排序是數(shù)據(jù)結(jié)構(gòu)主要內(nèi)容,并不限于語(yǔ)言主要在于思想;大學(xué)曾經(jīng)用C語(yǔ)言研究過(guò)一段時(shí)間的排序?qū)崿F(xiàn), 這段時(shí)間有空用JS再將排序知識(shí)點(diǎn)熟悉一遍。

下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧

一、代碼匯總(一)

1、冒泡排序

2、改進(jìn)版冒泡排序

3、選擇排序

4、直接插入排序

5、二分插入排序

/*
 * @Author: laifeipeng 
 * @Date: 2019-02-20 10:00:36 
 * @Last Modified by: laifeipeng
 * @Last Modified time: 2019-02-21 11:57:58
 */

/********* 1、冒泡排序 **********/
// 很常見很容易理解的排序算法, 排序思路:遍歷數(shù)組,每次遍歷就將最大(或最小)值推至最前。越往后遍歷查詢次數(shù)越少
const bubbleSort = arr => {
 const list = arr.slice(); //保證函數(shù)為純函數(shù)
 const len = list.length;
 for (let i = 0; i < len; i++) {
 for (let j = len - 1; j > i; j--) {
  if (list[j] < list[j - 1]) {
  [list[j - 1], list[j]] = [list[j], list[j - 1]];
  }
 }
 }
 return list;
}

/********* 2、改進(jìn)版冒泡排序 **********/
// 對(duì)上述冒泡排序的一種優(yōu)化, 優(yōu)化思路:當(dāng)一次遍歷前后數(shù)組不產(chǎn)生變化時(shí),說(shuō)明該數(shù)組已經(jīng)有序,結(jié)束排序。
const bubbleSort2 = arr => {
 const list = arr.slice(); //保證函數(shù)為純函數(shù)
 const len = list.length;
 for (let i = 0; i < len; i++) {
 let exchange = false;
 for (let j = len - 1; j > i; j--) {
  if (list[j] < list[j - 1]) {
  [list[j - 1], list[j]] = [list[j], list[j - 1]];
  exchange = true;
  }
 }
 if (!exchange) return list
 }
 return list;
}

/********* 3、選擇排序 **********/
// 在無(wú)序區(qū)中選出最小的元素,然后將它和無(wú)序區(qū)的第一個(gè)元素交換位置。
const selectionSort = arr => {
 const list = arr.slice(); //保證函數(shù)為純函數(shù)
 const len = list.length;
 for (let i = 0; i < len; i++) {
 let k = i
 for (let j = len - 1; j > i; j--) {
  if (list[j] < list[k]) k = j;
 }
 if (k !== i) {
  [list[k], list[i]] = [list[i], list[k]];
 }
 }
 return list;
}

/********* 4、直接插入排序 **********/
// 每次選擇無(wú)序區(qū)第一個(gè)元素插入到有序區(qū),并排序
const insertSort = arr => {
 const list = arr.slice(); //保證函數(shù)為純函數(shù)
 const len = list.length;
 for (let i = 1; i < len; i++) {
 const tmp = list[i];
 let j = i - 1;
 while (j >= 0 && tmp < list[j]) {
  list[j + 1] = list[j];
  j--;
 }
 list[j + 1] = tmp;
 }
 return list;
}

/********* 5、二分插入排序 **********/
// 插入排序的一種優(yōu)化實(shí)現(xiàn), 通過(guò)二分法減少遍歷時(shí)間(以前是從某邊開始依次比較,現(xiàn)在從中間開始比較,減少比較次數(shù))
// 注意,數(shù)組很大才能提現(xiàn)二分插入的優(yōu)勢(shì)
const insertSort2 = arr => {
 const list = arr.slice(); //保證函數(shù)為純函數(shù)
 const len = list.length;
 for (let i = 1; i < len; i++) {
 const tmp = list[i];
 let low = 0;
 let high = i - 1;
 let j = i - 1;
 while (low <= high) {
  const mid = ~~((low + high) / 2);
  if (tmp < list[mid]) {
  high = mid - 1;
  } else {
  low = mid + 1;
  }
 }
 while (j > high) {
  list[j + 1] = list[j];
  j--;
 }
 list[j + 1] = tmp;
 }
 return list;
}

2、代碼匯總(二)

6、快速排序

7、原地算法快速排序

8、希爾排序

堆排序、歸并排序(js實(shí)現(xiàn)無(wú)優(yōu)勢(shì),不作實(shí)現(xiàn))

/********* 6、快速排序 **********/
const quickSort1 = arr => {
 const list = arr.slice(); //為了保證這個(gè)函數(shù)是純函數(shù),拷貝一次數(shù)組
 if (list.length <= 1) return list;
 const pivot = list.splice(0, 1)[0]; //選第一個(gè)作為基數(shù),并把基數(shù)從數(shù)組里面刪除
 const left = [];
 const right = [];
 for (let i = 0, len = list.length; i < len; i++) { //從0開始
 if (list[i] < pivot) {
  left.push(list[i]);
 } else {
  right.push(list[i]);
 }
 }
 return [...quickSort(left), pivot, ...quickSort(right)];
}

// 上面const pivot = list.splice(0, 1)[0]; 如果想直接改為list[0],那么后面循環(huán)的時(shí)候要從i=1開始
const quickSort2 = arr => {
 const list = arr.slice(); //為了保證這個(gè)函數(shù)是純函數(shù),拷貝一次數(shù)組
 if (list.length <= 1) return list;
 const pivot = list[0]; //選第一個(gè)作為基數(shù)
 const left = [];
 const right = [];
 for (let i = 1, len = list.length; i < len; i++) { //從1開始
 if (list[i] < pivot) {
  left.push(list[i]);
 } else {
  right.push(list[i]);
 }
 }
 return [...quickSort(left), pivot, ...quickSort(right)];
}

/********* 7、原地算法快速排序 **********/
const quickSort = arr => {
 const list = arr.slice() // 為了保證這個(gè)函數(shù)是純函數(shù)拷貝一次數(shù)組
 const sort = (arr, left = 0, right = arr.length - 1) => {
 if (left >= right) {//如果左邊的索引大于等于右邊的索引說(shuō)明整理完畢
  return;
 }
 let i = left;
 let j = right;
 const baseVal = arr[j]; // 取無(wú)序數(shù)組最后一個(gè)數(shù)為基準(zhǔn)值
 while (i < j) {   //把所有比基準(zhǔn)值小的數(shù)放在左邊大的數(shù)放在右邊
  while (i < j && arr[i] <= baseVal) { //找到一個(gè)比基準(zhǔn)值大的數(shù)交換
  i++;
  }
  arr[j] = arr[i]; // 將較大的值放在右邊如果沒(méi)有比基準(zhǔn)值大的數(shù)就是將自己賦值給自己(i 等于 j)
  while (j > i && arr[j] >= baseVal) { //找到一個(gè)比基準(zhǔn)值小的數(shù)交換
  j--;
  }
  arr[i] = arr[j]; // 將較小的值放在左邊如果沒(méi)有找到比基準(zhǔn)值小的數(shù)就是將自己賦值給自己(i 等于 j)
 }
 arr[j] = baseVal; // 將基準(zhǔn)值放至中央位置完成一次循環(huán)(這時(shí)候 j 等于 i )
 sort(arr, left, j - 1); // 將左邊的無(wú)序數(shù)組重復(fù)上面的操作
 sort(arr, j + 1, right); // 將右邊的無(wú)序數(shù)組重復(fù)上面的操作
 }
 sort(list);
 return list;
}

/********* 8、希爾排序 **********/
// 排序思路:先將整個(gè)待排序記錄序列分割成若干個(gè)子序列,在序列內(nèi)分別進(jìn)行直接插入排序,待整個(gè)序列基本有序時(shí),再對(duì)全體記錄進(jìn)行一次直接插入排序。
const shellSort = arr => {
 const list = arr.slice(); //保證函數(shù)為純函數(shù)
 const len = list.length;
 let gap = ~~(len / 2);
 while (gap > 0) {
 for (let i = gap; i < len; i++) {
  const tmp = list[i];
  let j = i - gap;
  while (j >= 0 && tmp < list[j]) {
  list[j + gap] = list[j];
  j = j - gap;
  }
  list[j + gap] = tmp;
 }
 gap = ~~(gap / 2);
 }
 return list;
}

3、效果圖


4、解答

1、如何在控制臺(tái)打印出上面圖片中的彩色效果,eg:

const logStep = (i, leftArr, rightArr) => 
console.log(`%c 第${i}趟排序:%c ${arrStr(leftArr)} %c${arrStr(rightArr)} `, 'color:green', 'color:red', 'color:blue');

2、交換數(shù)組2元素:

// 交換下標(biāo)為i,k的數(shù)組元素
[list[k], list[i]] = [list[i], list[k]];

3、所有源碼github地址:

https://github.com/laifeipeng/utils/blob/master/sort/sort.js

4、彩色打印效果的github地址:

https://github.com/laifeipeng/utils/blob/master/sort/test.js

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 微信小程序路由跳轉(zhuǎn)兩種方式示例解析

    微信小程序路由跳轉(zhuǎn)兩種方式示例解析

    這篇文章主要為大家介紹了微信小程序路由跳轉(zhuǎn)兩種方式示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Bootstrap編寫一個(gè)兼容主流瀏覽器的受眾門戶式風(fēng)格頁(yè)面

    Bootstrap編寫一個(gè)兼容主流瀏覽器的受眾門戶式風(fēng)格頁(yè)面

    這篇文章主要介紹了Bootstrap編寫一個(gè)兼容IE8、谷歌等主流瀏覽器的受眾門戶式風(fēng)格頁(yè)面,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 微信小程序全局文件的使用詳解

    微信小程序全局文件的使用詳解

    在小程序開發(fā)時(shí),每個(gè)頁(yè)面都對(duì)應(yīng)一個(gè)目錄,每個(gè)目錄又分別有wxml、wxss、js和json四個(gè)文件。詳細(xì)說(shuō)明可查看后續(xù)文章介紹,本文主要詳解全局文件
    2022-08-08
  • 微信小程序?qū)崿F(xiàn)消息框彈出動(dòng)畫

    微信小程序?qū)崿F(xiàn)消息框彈出動(dòng)畫

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)消息框彈出動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 淺談Cookie的生命周期問(wèn)題

    淺談Cookie的生命周期問(wèn)題

    下面小編就為大家?guī)?lái)一篇淺談Cookie的生命周期問(wèn)題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • 微信小程序教程系列之視圖層的條件渲染(10)

    微信小程序教程系列之視圖層的條件渲染(10)

    這篇文章主要為大家詳細(xì)介紹了微信小程序教程系列之視圖層的條件渲染,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • js重寫alert事件(避免alert彈框標(biāo)題出現(xiàn)網(wǎng)址)

    js重寫alert事件(避免alert彈框標(biāo)題出現(xiàn)網(wǎng)址)

    這篇文章主要給大家介紹了關(guān)于js重寫alert事件的相關(guān)資料,這樣可以避免alert彈框標(biāo)題出現(xiàn)網(wǎng)址的情況,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • JS常見問(wèn)題整理(持續(xù)更新)

    JS常見問(wèn)題整理(持續(xù)更新)

    JS常見問(wèn)題在開發(fā)過(guò)程中會(huì)經(jīng)常遇到過(guò),本文整理了一些實(shí)際開發(fā)中存在的問(wèn)題,曬出來(lái)與大家一起分享,感興趣的朋友可以參考下,希望對(duì)大家有所幫助
    2013-08-08
  • js將滾動(dòng)條滾動(dòng)到指定位置的簡(jiǎn)單實(shí)現(xiàn)方法

    js將滾動(dòng)條滾動(dòng)到指定位置的簡(jiǎn)單實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇js將滾動(dòng)條滾動(dòng)到指定位置的簡(jiǎn)單實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的, 現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • JS實(shí)現(xiàn)在狀態(tài)欄顯示打字效果完整實(shí)例

    JS實(shí)現(xiàn)在狀態(tài)欄顯示打字效果完整實(shí)例

    這篇文章主要介紹了JS實(shí)現(xiàn)在狀態(tài)欄顯示打字效果的方法,涉及JavaScript中字符遍歷結(jié)合時(shí)間函數(shù)對(duì)狀態(tài)欄顯示進(jìn)行操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11

最新評(píng)論