总结4种常用排序(快排选择排序冒泡排序插入排序)

Posted 程序猿knight

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了总结4种常用排序(快排选择排序冒泡排序插入排序)相关的知识,希望对你有一定的参考价值。

一、 选择排序

概念理解:

  • 在一个长度为3的数组中,在第一趟遍历3个数据,找出其中最小的数值与第一个元素交换;

  • 第二趟遍历2个数据,找出其中最小的元素与第一个数交换(注意:这里的第一个数是指遍历的第一个数,实质上是数组的第二个数)

  • 而第三趟则是和自己比较,位置还是原来的位置

复杂度:

平均时间复杂度:O(n^2)

例子:

 
   
   
 
  1. //选择排序

  2. function selectionSortFn(arr){

  3.    console.log('原数组:['+ arr + ']')

  4.    for (var i = 0; i < arr.length; i++) {

  5.        for (var j = i+1; j < arr.length; j++) {

  6.            if (arr[i] > arr[j]) {

  7.                var temp = arr[i];

  8.                arr[i] = arr[j];

  9.                arr[j] = temp;

  10.            }

  11.        }

  12.        console.log(arr);

  13.    }

  14.    return arr;

  15. }

  16. var initArr = [10, 4, 8, 3];

  17. selectionSortFn(initArr);

我们看一下打印的结果:

结合概念就很好理解了。

二、 冒泡排序

概念理解:

依次比较相邻的两个数,将小数放在前面,大数放在后面。

  • 第一趟:首先比较第一个和第二个数,将小数放前,大数放后,然后比较第二个数和第三个数将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后,至此第一趟结束。

  • 在第二趟:仍从第一对数开始比较 (因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个 数),将小数放前中,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟 结束。在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。

  • 如此下去,重复以上过程,直至最终完成排序。

复杂度

时间复杂度:O(n^2)

例子

 
   
   
 
  1. //冒泡排序

  2. function bubbleSortFn(arr){

  3.    console.log('原数组:['+arr + ']')

  4.    for (var i = 0; i < arr.length-1; i++) {

  5.        for (var j = 0; j < arr.length-1-i; j++) {

  6.        //每次比较都会确定一个最小数,所以j < arr.length-1-i

  7.            if (arr[j] > arr[j+1]) {

  8.                var temp = arr[j];

  9.                arr[j] = arr[j+1];

  10.                arr[j+1] = temp;

  11.            }

  12.        }

  13.        console.log(arr)

  14.    }

  15.    return arr;

  16. }

  17. var initArr = [10, 4, 8, 3];

  18. bubbleSortFn(initArr);

我们看一下打印的结果:

总结4种常用排序(快排、选择排序、冒泡排序、插入排序)

三、 快速排序

概念理解:

  • 在带排序的元素中任取一个元素作为基准(通常选第一个),称为基准元素;

  • b将带排序的元素进行分区,比基准元素大的元素放在他的右边,比他小的放在左边;

  • c对左右两个分区重复以上步骤(递归)直达所有元素有序;

可以看张图帮助理解一下:总结4种常用排序(快排、选择排序、冒泡排序、插入排序)

复杂度

时间复杂的:O(nlogn)

例子

 
   
   
 
  1. //快速排序

  2. function quickSortFn(arr){

  3.    console.log('原数组:['+arr + ']')

  4.    // 如果数组长度<=1 ,则直接返回

  5.    if (arr.length <= 1) return arr;

  6.    //

  7.    var bisectionIndex = Math.floor(arr.length/2);

  8.    // 找基准,把基准从原数组中删除

  9.    var bisection = arr.splice(bisection,1)[0];

  10.    // console.log(bisection);

  11.    // 定义作用数组

  12.    var left = [];

  13.    var right = [];

  14.    // 比基准小的放left ,比基准大的放right

  15.    for (var i = 0; i < arr.length; i++) {

  16.        if (arr[i] <= bisection) {

  17.            left.push(arr[i]);

  18.        }else{

  19.            right.push(arr[i]);

  20.        }

  21.        console.log(arr);

  22.    }

  23.    //递归

  24.    return quickSortFn(left).concat([bisection],quickSortFn(right));

  25. }

  26. var initArr = [10, 4, 8, 3];

  27. quickSortFn(initArr);

我们看一下打印结果:

总结4种常用排序(快排、选择排序、冒泡排序、插入排序)

四、插入排序

概念理解:

检查第i个数字,如果在它的左边的数字比它大,进行交换,这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。

复杂度

时间复杂度:O(n^2)

例子

 
   
   
 
  1. //插入排序

  2. function insertSortFn(arr){

  3.    console.log('原数组:['+arr + ']')

  4.    for (var i = 1; i < arr.length; i++) {

  5.        var temp = arr[i];

  6.        for (var j = i-1; j >=0 && temp < arr[j]; j--) {

  7.            arr[j+1] = arr[j];

  8.            arr[j] = temp;

  9.        }

  10.        console.log(arr)

  11.    }

  12.    return arr;

  13. }

  14. var initArr = [10, 4, 8, 3];

  15. insertSortFn(initArr);

我们看一下打印结果:

四、总结

  • 冒泡排序是排序里面最简单的了,但性能也最差,数量小的时候还可以,数量多,是非常慢的。

  • 冒泡、选择、插入三个排序复杂度都是一样的(慢)

  • 快速排序效率最高。平均时间复杂度是 O(Nlog2N),最差也是O(N*N),空间复杂度O(Nlog2N)


推荐阅读








微信号:Yuanping1510



以上是关于总结4种常用排序(快排选择排序冒泡排序插入排序)的主要内容,如果未能解决你的问题,请参考以下文章

php 常用四种排序 冒泡,选择,插入,快排

你所知道的十大排序算法的总结(冒泡,选择,插入,希尔,归并,快排,堆排序,计数排序,桶排序,基数排序)

8种面试经典!排序详解--选择,插入,希尔,冒泡,堆排,3种快排,快排非递归,归并,归并非递归,计数(图+C语言代码+时间复杂度)

Java 常用算法(冒泡选择插入快排)

简单的排序算法(冒泡,选择排序,快排,插入排序)

关于常用排序算法的一个总结