ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

排序算法

2019-06-21 12:39:36  阅读:171  来源: 互联网

标签:arr 元素 算法 有序 var 排序


基本排序算法 基本排序的基本思想非常类似,重排列时用的技术基本都是一组嵌套的for循环: 外循环遍历数组的每一项,内循环则用于比较元素。由于都要两层嵌套循环,所以平均时间复杂度都为 O(n²)。

一、冒泡排序

  • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
  • 针对所有的元素重复以上的步骤,除了最后一个;
  • 重复步骤1~3,直到排序完成。
<script>
        var arr = [1,3,4,2,7,4,5,5,9,1];
        function bubblesort(arr){
            for(var i=0;i<arr.length-1;i++){  // 要比较的趟数
                var flag = 0;     //设置标志位判断这一趟有没有变换数值
                for(var j=0;j<arr.length-1-i;j++){   //比较相邻的两个数,将比较大的那个放在后面,再比较相邻的数,循环将大的数放置在arr[arr.length-1-i]中
            if(arr[j]>arr[j+1]){ var temp = 0; // 变换两个数的数值 temp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = temp; flag = true; } } if(flag==0){ //没有变换数值则有序 break; } } } bubblesort(arr); for(var k= 0;k<arr.length;k++){ document.write(arr[k]); } </script>

二、选择排序

  顾名思义,就是选择最小的,外层循环当前要比较的位置,内层循环查找出剩下的元素里面最小的。

外层循环的i表示第几轮,arr[i]就表示当前轮次最靠前(小)的位置; 内层从i开始,依次往后数,找到比开头小的,互换位置即可。
function selectsort(arr){
            var len = arr.length;
            for(var i=1;i<len;i++){
                for(var j = i;j<len;j++){
                    if(arr[i]>arr[j]){
                        [arr[i],arr[j]] = [arr[j],arr[i]];
                    }
                }
            }
            return arr
        }

 三、插入排序

  首先将待排序的第一个记录作为一个有序段,从第二个开始,到最后一个,依次和前面的有序段进行比较,确定插入位置。插入排序核心--扑克牌思想: 就想着自己在打扑克牌,接起来一张,放哪里无所谓,再接起来一张,比第一张小,放左边,继续接,可能是中间数,就插在中间....依次

插入排序具体算法描述如下:

  第一个元素默认为已经排序完成,取下一个元素,从后往前扫描已经完成的元素序列,如果扫描到的已经排序的元素大于取得的元素,则将扫描到的已经排序的元素移到下一个位置,知道找到扫描的元素小于或者等于新的元素,再取下一个元素重复。

function insertsort(arr) {
            var len = arr.length;
            for (var i = 1; i < len; i++) {
                for (var j = i; j > 0; j--) {
                    if (arr[j] < arr[j - 1]) {
                        [arr[j], arr[j - 1]] = [arr[j - 1], arr[j]];
                    }
                    else {
                        break;
                    }
                }
            }
            return arr
        }
1.i是外循环,依次把后面的数插入前面的有序序列中,默认arr[0]为有序的,i就从1开始 2. j进来后,依次与前面队列的数进行比较,因为前面的序列是有序的,因此只需要循环比较、交换即可 3. 注意这里的break,因为前面是都是有序的序列,所以如果当前要插入的值`arr[j]`大于或等于arr[j-1],则无需继续比较,直接下一次循环就可以了。 基本排序算法对于大数据来说处理量非常的大了,那么以下是高级排序算法,对于大数据来说,复杂度可以大大的减少了。 四、快速排序 快速排序是很重要的排序算法,采用了分而治之的想法,先找到一个基准,然后把大于基准的元素放在基准的右边,小于基准的元素放在基准的左边,接着递归此过程,直到此序列有序。
function quickSort1(arr) {
            if (arr.length < 1) {
                return arr;  //递归出口
            }
            var left = [],
                right = [],
                current = arr.splice(0, 1); //注意splice后,数组长度少了一个
            for (var i = 0; i < arr.length; i++) {
                if (arr[i] < current) {
                    left.push(arr[i])  //放在左边
                } else {
                    right.push(arr[i]) //放在右边
                }
            }
            return quickSort1(left).concat(current,quickSort1(right)); //递归
        }

快速排序算法的平均时间复杂度是O(n log n),最坏情况也是O(n²)。

标签:arr,元素,算法,有序,var,排序
来源: https://www.cnblogs.com/tutuj/p/11063902.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有