js实现冒泡,插入,快排算法一纯手工制造

不稳定排序:快速排序,选择排序,堆排序,希尔排序(快选堆希)

稳定排序:插入排序,冒泡排序,归并排序,基数排序(插冒归基)

算法的稳定性判读:排序前2个相等的数在序列中的前后位置顺序与排序后它们两个的前后位置顺序相同

冒泡排序(适用于数据规模很小时)

此案例为从小到大,原理如下:

1 比较相邻元素之间大小,如果前面的值大于后面的值,则交换值的顺序,即小的值放前面(这样得到数组最后一个值为这个数组最大值)

2 上一步操作确定了数组最后一个值为最大值,此时除了最后一个值其他值再次重复步骤1, 依此类推

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>冒泡</title>
</head>
<body>
<script type="text/javascript">
    var arr = [9, 2, 4, 1, 8];
    function bubbleSort(arr) {
        var i = arr.length - 1;
        var j;
        var temp;
        while (i > 0) {
            for (j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            i--;
        }
        return arr;
    }
    var arrSorted = bubbleSort(arr);
    console.log(arrSorted);
    alert(arrSorted);
</script>
</body>
</html>

复杂度计算(即需要比较的次数求和): 

s = (n-1)+ (n-2) + (n-3) + ......+ 1 + 0

偶数项时:

观察第一项加最后一项等于第二项加倒数第二项即等于 n-1

所以s = n(n-1)/ 2        

基数项时: 

基本规律同上,相加等于n-1的有 (n -1) /2项,除了中间项值为n - ((n-1)/2 + 1)

所以: s = (n -1)(n-1)/ 2 + (n - ((n-1)/2 + 1))        

               = n(n-1)/2

即s =  n(n-1)/ 2     

当n足够大时, n(n-1)/ 2 等于n², 由此得出复杂度为 n²

快速排序

* 快速排序(Quicksort)是对冒泡排序的一种改进

* 快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

* 快速排序的平均时间复杂度也是O(nlog2n)。因此,该排序方法被认为是目前最好的一种内部排序方法。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>快排</title>
</head>
<body>
<script type="text/javascript">
    var arr = [90,9,12,6,30,60,36,32,40];
      function quickSort(arr){
        if (arr.length <= 1) { return arr; }
         var pivotIndex = Math.floor(arr.length / 2); //取基值的下标
         var pivot = arr.splice(pivotIndex, 1)[0];    //删除基值后的第一个值,并返回该值
         var left = [];  //定义一个左数组
         var right = [];
         for (var i = 0; i < arr.length; i++){
           if (arr[i] < pivot) {
              left.push(arr[i]); //左边数组
            } else {
              right.push(arr[i]);
             }
         }
        return quickSort(left).concat([pivot], quickSort(right));
      }
        //concat() 方法用于连接两个或多个数组,该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
    var newsort = quickSort(arr);
    console.log(newsort);
    alert(newsort);
</script>
</body>
</html>

直接插入排序(数据有序程度越高,越高效)

直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。

具体流程如下:

1 首先比较数组的前两个数据,并排序;
2 比较第三个元素与前两个排好序的数据,并将第三个元素放入适当的位置;
3 比较第四个元素与前三个排好序的数据,并将第四个元素放入适当的位置;
4 直至把最后一个元素放入适当的位置。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>直接插入</title>
    <body>
      <script type="text/javascript" >
        var arr=[5,2,4,6,1,3];
        function insertSort(){
            var key;
            var i;
            for(var j=1;j<arr.length;j++){
                key=arr[j];
                i=j-1;
                while(i>-1&&arr[i]>key){
                    arr[i+1]=arr[i];
                    i=i-1;
                }
                arr[i+1]=key;
                }
            return arr;
            }
        var newsort = insertSort(arr);
        console.log(newsort);
        alert(newsort);
    </script>
</body>
</html>

希尔排序

* 是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort)

* 是直接插入排序算法的一种更高效的改进版本

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8"/>
  <title>希尔排序</title>
  <body>
    <script type="text/javascript" >
      var arr = [49, 38, 65, 97, 76, 13, 27, 49, 55, 04];
      function insertSort(){
        var len = arr.length;
        for (var fraction = Math.floor(len / 2); fraction > 0; fraction = Math.floor(fraction / 2)) {
          for (var i = fraction; i < len; i++) {
            for (var j = i - fraction; j >= 0 && arr[j] > arr[fraction + j]; j -= fraction) {
              var temp = arr[j];
              arr[j] = arr[fraction + j];
              arr[fraction + j] = temp;
            }
          }
        }
        return arr;
      }
      var newsort = insertSort(arr);
      console.log(newsort);
    </script>
  </body>
</html>
原文地址:https://www.cnblogs.com/Tiboo/p/6773267.html