美文网首页
2019-09-09 排序算法 JavaScript实现

2019-09-09 排序算法 JavaScript实现

作者: 枫叶落尽 | 来源:发表于2019-10-05 18:49 被阅读0次

1、快速排序

快速排序的原理是:

每次将一个元素找到它的位置,同时将比它大的元素丢一边,将比它小的元素丢一边。

我们假设第一个元素在排序完成后应该位于红线位置,那么我们同时从两边开始比较,先取第一个元素,作为待比较元素,把它保存在一个额外的变量里,现在它的位置就空出来了:

然后从倒数第一个元素开始与待排序元素比较,如果指针所指的元素(绿色箭头)大于待排序元素,不用管,左移指针,一直重复这个步骤,直到遇到一个比待排序元素小的元素:

将它丢到左边的空位置里去:

然后,左边的指针往右移动,如果遇到比待排序元素大的元素:

将其右丢:

然后向左移动右边的指针,重复上述步骤,直到两个指针相遇:

说明一个待排序元素找到了它的位置,后面递归前面的步骤即可。

JavaScript实现:

    var arr = [10,8,6,4,2,1,3,5,7,9,0];
    for(let i=0,len = arr.length; i<len;i++)
        arr[i] = Math.round(Math.random()*100);
    console.log(arr);
    
    function quickSort(arr,left,right)
    {
        var left_keep = left, right_keep = right;
        if(right > left)
        {   
            var one = arr[left];
            let left_move = false;
            while(left < right)
            {
                if(left_move){
                    if(arr[left] < one){
                        left++;
                    }
                    else{
                        arr[right] = arr[left];
                        left_move = false;
                        right--;
                    }
                }
                else{
                    if(arr[right] > one){
                        right--;
                    }
                    else{
                        arr[left] = arr[right];
                        left_move = true;
                        left++;
                    }
                }
            }               
            arr[left] = one;
            console.log(arr.toString(),"待排序元素:"+one,"中界线:"+left);
            //递归调用
            if(left-1 > left_keep){ //只要还有两个或多余两个元素
                console.log("左边递归");
                quickSort(arr,left_keep,left-1);
            }
            if(right+1 < right_keep){
                console.log("右边递归");
                quickSort(arr,right+1,right_keep);
            }
        }       
    }
    quickSort(arr,0,10);

参考:生成随机数:
https://www.cnblogs.com/starof/p/4988516.html

2、冒泡排序

冒泡排序比较简单,JavaScript实现如下:

    var arr = [10,8,6,4,2,1,3,5,7,9,0]; //直接使用或随机生成数组进行测试
    for(let i=0,len = arr.length; i<len;i++)
        arr[i] = Math.round(Math.random()*100);
    console.log(arr);
    function bubleSort(arr)
    {
        for(let i=0,j=arr.length-1;i< j;i++) //第一层循环,是趟数 循环    趟数比元素个数少1
        {
            for(let k=0;k < j-i;) //第二次循环  ,是每趟中的元素循环  k最多取值到倒数第2个下标
            {
                if( arr[k] > arr[++k] )
                {
                    let temp = arr[k-1];
                    arr[k-1] = arr[k];
                    arr[k] = temp;
                }
            }
        }
    }
    bubleSort(arr);
    console.log(arr);

3、选择排序

基本思想是每次从待排序的一堆元素中,找到最小的,放到已排序的一堆元素的最后

    var arr = [10,8,6,4,2,1,3,5,7,9,0];
    for(let i=0,len = arr.length; i<len;i++)
        arr[i] = Math.round(Math.random()*100);
    console.log(arr);
    function selectionSort(arr)
    {
        for(let i=0,j=arr.length-1;i< j;i++) //i代表待填充的位置
        {
            let min_index=i;
            for(let k=i+1;k <= j;k++) 
            {
                if( arr[k] < arr[min_index] )
                {
                    min_index = k;
                }
            }
            let temp = arr[i];
            arr[i] = arr[min_index];
            arr[min_index] = temp;
            console.log(temp,arr[i],arr.toString());
        }
    }
    selectionSort(arr);
    console.log(arr);

4、插入排序

基本思想是每次从待排序的一堆元素取出第一个,把它插入到已经派好序的一堆元素中。

我们假设指针1所指的元素是已排好序的一堆元素中的最后一个,指针2就是每次待插入的元素,我们每次保存待插入元素到一个变量中:

然后将它们进行比较,如果指针2所指元素小于指针1所指元素:

则将元素后移,并将指针1左移:

因为指针1找不到元素了,所以将保存的待插入元素的值,赋值给第一个元素:

下一轮,指针1、2的开始位置如图:

然后重复上一轮的步骤。

    var arr = [10,8,6,4,2,1,3,5,7,9,0];
    for(let i=0,len = arr.length; i<len;i++)
        arr[i] = Math.round(Math.random()*100);
    console.log(arr);
    
    function insertionSort(arr)
    {
        for(let i=1,j=arr.length;i< j;i++)
        {
            let k = i-1;
            let temp = arr[i];
            while( temp < arr[k--] && k>-2){
                arr[k+2] = arr[k+1]; console.log("当前值小于已排序值" +arr[k+1]);
            }
            arr[k+2] = temp;
            console.log("排序一轮: ",arr.toString());
        }
    }
    insertionSort(arr);
    console.log(arr);

5、希尔排序

希尔排序是插入排序的改进,它把待排序的元素分成几个组来排序,然后多次按不同间距来分组,直到达到所有元素最后只分成一个组。
分组方法有多种,其中一种:我们最开始把两个元素分为一组(共n/2组):

然后在每组内进行插入排序,排序完成后,继续按新的间距分组,组内元素增加:

直到最后,将所有元素视为一个组,

6

7

8

相关文章

  • 2019-09-09 排序算法 JavaScript实现

    1、快速排序 快速排序的原理是: 每次将一个元素找到它的位置,同时将比它大的元素丢一边,将比它小的元素丢一边。 我...

  • 几种排序算法浅析--JavaScript

    算法好难啊!写点简单的。然后用JavaScript实现。 排序算法(Sorting Algorithm) 概念 一...

  • JS实现排序算法

    原文:常见排序算法之JavaScript实现 - 知乎 目录 冒泡排序 选择排序 插入排序 合并排序 快速排序 1...

  • JavaScript实现经典排序算法

    使用JavaScript实现的经典排序算法 util 冒泡 简单选择 直接插入 快速排序 堆排序 归并排序

  • 斌斌学院JS-task5

    任务目的 学习与实践JavaScript的基本语法、语言特性 练习使用JavaScript实现简单的排序算法 任务...

  • JavaScript 实现多种排序算法

    本章将介绍 JavaScript 如何实现排序,几种排序算法介绍如下图: 准备工具函数 util.js 备用: 借...

  • 排序算法总结

    JavaScript实现十大排序算法,代码+动图+在实现代码的时候遇到的坑 冒泡算法 (1) 实现思路 不断的重复...

  • JavaScript实现排序算法

    排序算法主要用于元素的数组排序,常见的排序算法有冒泡排序,选择排序,插入排序,希尔排序,快速排序,归并排序等,这些...

  • javascript实现排序算法

    在上一篇博客中,介绍了插入排序的第一种,直接插入排序。再加上前面介绍过的快速排序,冒泡排序和简单选择排序。这四种排...

  • JavaScript实现排序算法

    一、冒泡排序(bubbleSort) 比较所有相邻元素,如果第一个比第二个大,则交换它们的位置 一轮下来,可以保证...

网友评论

      本文标题:2019-09-09 排序算法 JavaScript实现

      本文链接:https://www.haomeiwen.com/subject/kwcmyctx.html