[关闭]
@Bios 2018-12-10T08:45:53.000000Z 字数 2271 阅读 942

JavaScript 常见算法

js 算法


冒泡算法

原理:从第一个元素开始,往后比较,遇到自己小的元素就交换位置

此处输入图片的描述
代码实现:

  1. // 冒泡算法
  2. function bubbleSort(arr) {
  3. var len = arr.length;
  4. for (var i = 0; i < len; i++) {
  5. for (var j = 0; j < len-1-i; j++) {
  6. // 为什么要减一,数组从0开始,先取第一个与第二个比,再将较大值与第三个比,一直比到最后一个,再拿第二个值与第三个比……(外层循环一次,内层循环多次)
  7. if (arr[j] > arr[j+1]) { // 比较相邻两个值的大小
  8. var temp = arr[j+1]; // 临时变量存储arr[j+1]的值
  9. arr[j+1] = arr[j]; // 将arr[j]的值赋值给arr[j+1],即把较大值往后放
  10. arr[j] = temp; // 又将temp的值赋值给arr[j],即将较小值往前放
  11. }
  12. }
  13. }
  14. return arr;
  15. }
  16. var arr = [2, 3, 4, 5, 6, 1, 90, 16, 35, 7];
  17. console.log(bubbleSort(arr)); // [1, 2, 3, 4, 5, 6, 7, 16, 35, 90]

插入排序

此处输入图片的描述
Gif图:
此处输入图片的描述

特点:
插入排序把要排序的数组分成两部分:
第一部分包含了这个数组的所有元素,但将第一个元素除外(让数组多一个空间才有插入的位置)。
第二部分就是包含了这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分
比冒泡排序快一点

代码实现:

  1. // 插入排序
  2. function insertSort(arr) {
  3. // 从第二个元素开始,因为要留一个坑
  4. for (var i = 1; i < arr.length; i++) {
  5. var x = arr[i]; // 现将arr[i]的值存下来
  6. for (var j = i-1; arr[j] > x; j--) {
  7. arr[j+1] = arr[j]; // i=3时 [2, 3, 6, 6, ...]
  8. }
  9. if (arr[j+1] != x) {
  10. arr[j+1] = x; // i=3时 j=2 [2, 3, 4, 6, ...]
  11. }
  12. }
  13. return arr;
  14. }
  15. var arr = [2, 3, 6, 4, 2, 1, 90, 100, 20, 5];
  16. console.log(insertSort(arr)); //[1, 2, 2, 3, 4, 5, 6, 20, 90, 100]

希尔排序

此处输入图片的描述

此处输入图片的描述

代码实现:

  1. // 希尔排序
  2. function shellSort(arr) {
  3. var gap = Math.floor(arr.length / 2);
  4. while (gap > 0) {
  5. for (var i = gap; i < arr.length; i++) {
  6. temp = arr[i];
  7. for (var j = i; j >= gap && arr[j-gap] > temp; j -= gap) {
  8. arr[j] = arr[j - gap];
  9. }
  10. arr[j] = temp;
  11. }
  12. gap = Math.floor(gap / 2);
  13. }
  14. return arr;
  15. }
  16. var arr = [2, 3, 6, 4, 2, 1, 90, 100, 20, 5];
  17. console.log(shellSort(arr)); //[1, 2, 2, 3, 4, 5, 6, 20, 90, 100]

快速排序

此处输入图片的描述
3、对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
此处输入图片的描述

特点:速度最快。和归并排序不同的是,归并排序是先分为两组再继续排,而快速排序是边分边排

代码实现:

  1. // 大致分三步:
  2. // 1、找基准(一般以中间项为基准)
  3. // 2、遍历数组,小于基准的放在left,大于基准的放在right
  4. // 3、递归
  5. function quickSort(arr) {
  6. // 如果数组<=1,则直接返回
  7. if (arr.length <= 1) {
  8. return arr;
  9. }
  10. var pivotIndex = Math.floor(arr.length / 2);
  11. // 找基准,并把基准从原数组删除
  12. var pivot = arr.splice(pivotIndex, 1)[0];
  13. // 定义左右数组
  14. var left = [];
  15. var right = [];
  16. // 比基准小的放在left,比基准大的放在right
  17. for (var i = 0; i < arr.length; i++) {
  18. if(arr[i] <= pivot) {
  19. left.push(arr[i]);
  20. } else {
  21. right.push(arr[i]);
  22. }
  23. }
  24. // 递归
  25. return quickSort(left).concat([pivot], quickSort(right));
  26. }
  27. var arr = [2, 3, 6, 4, 2, 1, 90, 100, 20, 5];
  28. console.log(quickSort(arr)); //[1, 2, 2, 3, 4, 5, 6, 20, 90, 100]

奇偶排序

此处输入图片的描述

此处输入图片的描述

代码实现:

  1. //奇偶排序
  2. function oddEvenSort(arr) {
  3. // swaped用来控制循环是否要继续,如果左边的都比右边的小,则退出循环,返回排好的数组
  4. var swaped = true;
  5. var k = 0;
  6. while(swaped) {
  7. if(k > 0) {
  8. swaped = false;
  9. }
  10. for (var i = k;i < arr.length-1; i += 2) {
  11. if(arr[i] > arr[i+1]) {
  12. // 如果左边的数字比右边的大,两边交换位置
  13. arr[i] = [arr[i+1], arr[i+1] = arr[i]][0];
  14. swaped = true;
  15. }
  16. }
  17. k = [1, 0][k]; // 奇偶数之间的转换
  18. }
  19. return arr;
  20. }
  21. var arr = [2, 3, 6, 4, 2, 1, 90, 100, 20, 5];
  22. console.log(oddEvenSort(arr)); // [1, 2, 3, 4, 5, 6, 20, 90, 100]
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注