几种简单排序算法

引文:十大经典排序算法

算法即解决问题的方法。

先从一张表认识排序算法:

å大ç»å¸æåºç®æ³ æ¦è§æªå¾

1. 认识时间复杂度

O(f(n)):用同样曲线类型的函数f(n)来表示这个算法在n不断变大的趋势。

O(1) :运算次数为常数的算法 : (简单赋值操作:temp = a)

O(n) :操作次数和n正比线性增长:

  sum=0;           //频度: 1            
  for(i=0;i<n;i++)          n
     sum++;                n
                            //f(n)=2n+1

O(n^{2}):常见简单算法都是这个

sum=0;             //频度: 1
for(i=0;i<n;i++)            n
  for(j=0;j<n;j++)          n^{2}
     sum++;                n^2
                          //f(n)= 2n^2 + n +1

2. 几种简单排序算法

1. 冒泡排序(bubble sort)

å¨å¾æ¼ç¤º

算法原理:比较相邻元素,如果第一个比第二个大就交换位置。

javascript实现:

function bubbleSort(arr) {
  var len = arr.length;
  for (var i = 0; i < len - 1; i++) {
    for (var j = 0; j < len - 1 - i; j++) {
      if (arr[j] > arr[j+1]) {    //如果相邻元素,第一个大于第二个
        var temp = arr[j+1]; 
        arr[j+1] = arr[j];  // 元素交换
        arr[j] = temp;
      }
    }
  }
  return arr
}

2.选择排序

å¨å¾æ¼ç¤º

算法原理:在未排序序列中寻找最大(小)元素,存放到排序序列的起始位置

JavaScript实现:

function selectSort(arr) {
  var len = arr.length;
  var minIndex, temp;
  for (var i=0; i<len-1; i++) {
    minIndex = i;           //i之前的为已经排序的数组
    for (var j = i+1; j < len; j++) {
      if (arr[j] < arr[minIndex]) {   //找到数组中未排序元素的最小值
        minIndex = j                  //取得最小元素的索引
      }
    }
    temp = arr[i];
    arr[i] = arr[minIndex];
    arr[minIndex] = temp;
  }
  return arr
}

3. 插入排序

å¨å¾æ¼ç¤º

算法原理:将未排序序列在已排序序列中从后向前扫描,找到相应位置插入

JavaScript实现:

function bubbleSort(arr) {
  var len = arr.length;
  var preIndex, current;
  for (var i=0; i<len;i++) {  //遍历整个数组
    preIndex = i -1;
    current = arr[i];
    while (preIndex >= 0 && arr[preIndex] > current) {  //如果前一个元素比当前元素大
      arr[preIndex+1] = arr[preIndex];    //当前元素为两者中较大的那个值
      preIndex --   //再往前遍历
    }
    arr[preIndex+1] = current; //找到最小的值得索引并把当前值赋值
  }
  return arr
}

4. 希尔排序

算法原理:将整个序列分割成若干子序列,然后分别进行直接插入排序,再对全体进行直接插入排序。

JavaScript实现:

function shellSort(arr) {
    var len = arr.length,
        temp,
        gap = 1;
    while(gap < len/3) {          //动态定义间隔序列
        gap =gap*3+1;
    }
    for (gap; gap > 0; gap = Math.floor(gap/3)) {
        for (var i = gap; i < len; i++) {
            temp = arr[i];
            for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) {
                arr[j+gap] = arr[j];
            }
            arr[j+gap] = temp;
        }
    }
    return arr;
}

猜你喜欢

转载自blog.csdn.net/weixin_41892205/article/details/81279923
今日推荐