排序算法

基本排序算法
基本排序的基本思想非常类似,重排列时用的技术基本都是一组嵌套的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²)。

posted @ 2019-06-21 12:25  蒋涂涂  Views(148)  Comments(0Edit  收藏  举报