JavaScript实现的几种排序

原创 青春正当时 随笔 JavaScript 251阅读 2018-07-02 15:10:10 举报

1.冒泡排序
原理:冒泡排序的过程就是将数组中相邻的两个元素进行比较,如果前面的元素比后面的元素要大交换位置,否则位置不变;举个栗子:有数组 arr = [3,5,4,2,1];
第一轮循环:3和5比较,3小于5两者位置不变,接下来5和4比较,5大于4,两者交换位置,接着5和2比较,5>2两者交换位置,继续5和1 比较 5>1两者交换位置,一轮后得到的数组是[3,4,2,1,5];把大的元素放到数组的最末尾,这种就像水泡样一层一层的像后移动,就是冒泡排序了;
代码实现:

2.选择排序
选择排序和冒泡排序类似也是依次对相邻的数进行两两比较。不同之处在于,他不是每次两两相邻比较后交换位置,他是先找出最大(最小)将它放到正确的位置,然后再寻找次最大(最小)放在正确的位置;
举个栗子:有数组 arr = [3,5,4,2,1];
先假设第一个元素是最小值,并定义一个minidx=0变量记录最小(最大)值的位置,for循环和其他元素进行比较,3和5进行比较,5>3此时不做处理,4也是一样处理,当3和2比较时,3>2,此时将minidx赋值为2的位置,接下来用arr[minidx]和剩余的元素比较遇到比他小的就用minidx记录小值的位置;最后将最小的位置值和初始给的值位置进行互换(当然是初始的值和一轮循环下来的minidx位置不一样才互换);所以一轮循环下来结果是arr = [1,5,4,2,3]
代码实现:

3.插入排序
原理:将数组分为已排序和未排序,将第一个元素看作是已排序的元素,而其他是未排序的,从未排序的里面取出一元素和已排序元素进行比较,并插入到正确位置,这样已排序部分增加一个元素,而未排序的部分减少一个元素。直到排序完成
举个栗子:有数组 arr = [1,5,4,2,3],第一次假设元素1 是已排序部分,5,4,2,3为未排序,取出元素5加入已排序部分,5>1,已排序部分为1,5;而未排序部分为4,2,3;如此往复完成排序;
代码实现:

4.归并排序
原理: 将两个已经排序的数组合并,要比从头开始排序所有元素来得快。因此,可以将数组拆开,分成n个只有一个元素的数组,然后不断地两两合并,直到全部排序完成
代码实现:

5.快速排序
原理:快速排序是目前公认的速度快和高效的排序方式,时间复杂度O(nlogn)是比较理想的状态,他的实现过程是,先在数组找到一个基点,把大于这个基点的值放到右侧,小于基点的值放到左侧,再将右侧的和左侧的也按照这种方式再次分配,直到完成排序
举个栗子:有一个数组 arr = [1,5,4,2,3];假设我们找数组的中间点作为基点也就是4,那一轮循环后结果就是[1,2,3,4,5] ->_->怎么这么巧,一轮就OK,果然是快速排序,就是快 哈哈,当然程序不会这么做,他是严谨的,他还会去拆分[1,2,3]只是这个实际上已经是排好了的;
代码实现:粗糙一点的

上面这种方法缺点就是空间浪费,他会创建很多个left 和 right 这样的数组,造成空间的浪费,当数据量一大的话还是很恐怖的,所以我们要改进的就是,不新建中间数组,而是直接修改位移目标数组;

改进原理: 选取一个基点,从数组的两头两个指针分别向基点位移,位移的原则是,基点的左边的元素如果小于基点,那就像基点位置靠拢一位,i++,如果大于基点就原地不动,基点右边的元素反过来,如果大于基点就像基点靠拢一位,j--;如果小于就原地不动;这时再比较两个原地不动的点,如果右边的不动点小于左边的值,就互换他们的位置;

代码实现:

评论 ( 0 )
最新评论
暂无评论

赶紧努力消灭 0 回复