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

一、 选择排序

  1. 概念理解:

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

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

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

  2. 复杂度:

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

  3. 例子:
//选择排序
function selectionSortFn(arr){
    console.log(‘原数组:[‘+ arr + ‘]‘)

    for (var i = 0; i < arr.length; i++) {
        for (var j = i+1; j < arr.length; j++) {
            if (arr[i] > arr[j]) {
                var temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
        console.log(arr);
    }
    return arr;
}

var initArr = [10, 4, 8, 3];
selectionSortFn(initArr);

我们看一下打印的结果:

[选择排序]

原数组:[10,4,8,3]
[3, 10, 8, 4]
[3, 4, 10, 8]
[3, 4, 8, 10]
[3, 4, 8, 10]

结合概念就很好理解了。

二、 冒泡排序

  1. 概念理解:

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

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

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

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

  2. 复杂度

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

  3. 例子
//冒泡排序
function bubbleSortFn(arr){
    console.log(‘原数组:[‘+arr + ‘]‘)

    for (var i = 0; i < arr.length-1; i++) {
        for (var j = 0; j < arr.length-1-i; j++) {
        //每次比较都会确定一个最小数,所以j < arr.length-1-i
            if (arr[j] > arr[j+1]) {
                var temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
        console.log(arr)
    }
    return arr;
}

var initArr = [10, 4, 8, 3];
bubbleSortFn(initArr);

我们看一下打印的结果:

原数组:[10,4,8,3]
[4, 8, 3, 10]
[4, 3, 8, 10]
[3, 4, 8, 10]

三、 快速排序

  1. 概念理解:

    • 在带排序的元素中任取一个元素作为基准(通常选第一个),称为基准元素;
    • b将带排序的元素进行分区,比基准元素大的元素放在他的右边,比他小的放在左边;
    • c对左右两个分区重复以上步骤(递归)直达所有元素有序;
  2. 复杂度

    时间复杂的:O(nlogn)

  3. 例子
//快速排序
function quickSortFn(arr){
    console.log(‘原数组:[‘+arr + ‘]‘)
    // 如果数组长度<=1 ,则直接返回
    if (arr.length <= 1) return arr;
    //
    var bisectionIndex = Math.floor(arr.length/2);
    // 找基准,把基准从原数组中删除
    var bisection = arr.splice(bisection,1)[0];
    // console.log(bisection);

    // 定义作用数组
    var left = [];
    var right = [];

    // 比基准小的放left ,比基准大的放right
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] <= bisection) {
            left.push(arr[i]);
        }else{
            right.push(arr[i]);
        }
        console.log(arr);
    }
    //递归
    return quickSortFn(left).concat([bisection],quickSortFn(right));
}

var initArr = [10, 4, 8, 3];
quickSortFn(initArr);

我们看一下打印结果:

[4, 8, 3]
[4, 8, 3]
[4, 8, 3]
[8, 3]
[8, 3]

四、插入排序

  1. 概念理解:

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

  2. 复杂度

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

  3. 例子
//插入排序
function insertSortFn(arr){
    console.log(‘原数组:[‘+arr + ‘]‘)
    for (var i = 1; i < arr.length; i++) {
        var temp = arr[i];
        for (var j = i-1; j >=0 && temp < arr[j]; j--) {
            arr[j+1] = arr[j];
            arr[j] = temp;
        }
        console.log(arr)
    }
    return arr;
}

var initArr = [10, 4, 8, 3];
insertSortFn(initArr);

我们看一下打印结果:

原数组:[10,4,8,3]
[4, 10, 8, 3]
[4, 8, 10, 3]
[3, 4, 8, 10]

四、总结

  1. 冒泡排序是排序里面最简单的了,但性能也最差,数量小的时候还可以,数量多,是非常慢的。
  2. 冒泡、选择、插入三个排序复杂度都是一样的(慢)
  3. 快速排序效率最高。平均时间复杂度是 O(Nlog2N),最差也是O(N*N),空间复杂度O(Nlog2N)

原文地址:https://www.cnblogs.com/soyxiaobi/p/9588159.html

时间: 2024-10-05 05:01:54

总结4种常用排序(快排、选择排序、冒泡排序、插入排序)的相关文章

区间模糊排序---快排思路的应用

1 #include<iostream> 2 #include<ctime> 3 using namespace std; 4 #define max(a,b) (a>b)?a:b 5 #define min(a,b) (a>b)?b:a 6 class Interval 7 { 8 public: 9 double leftbound; 10 double rightbound; 11 Interval(int a, int b) :leftbound(a), rig

排序算法——直接选择排序

直接选择排序每一趟排序都会从未排序的序列中选择出最小的元素来,然后跟未排序序列的第一个元素交换.这样经过n-1趟排序后,每趟排序选择出的 最小元素便成了有序的序列. 算法实现如下: #include <stdio.h> #include <stdlib.h> void SelectSort(int A[],int n) { int i, j, index, temp; for(i = 0; i < n-1; i++) // 进行n-1趟排序 { index = i; // 辅

数据结构排序算法之选择排序

今天继续介绍一种排序算法:选择排序. 选择排序的基本思想就是从待排序列中选择出最小的,然后将被选出元素和序列的第一个元素互换位置(当前默认是升序排列),则互换完成后第一个元素就是整个序列的最小的元素,则一次选择排序结束.然后我们从剩下的子序列中选择出最小的,然后将该被选出来的元素和该子序列的第一个元素(即整个序列的第二个元素)互换位置,则当前整个序列的第二个元素就是当前序列中的次最小值,第二次选择排序结束.以此类推,直到该待排序列只剩下一个元素后,则整个序列有序. 具体过程如下图所示: 下面就不

选择排序算法---直接选择排序和堆排序

本文主要是解析选择排序算法:直接选择排序和堆排序. 一.直接选择排序   基本思想:       选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终

【排序算法】选择排序(Selection sort)

0. 说明 选择排序(Selection sort)是一种简单直观的排序算法. 它的工作原理如下. 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对 n 个元素的表进行排序总共进行至多 n-1 次交换.在所有的完全依

常见排序算法之选择排序

1.直接选择排序 直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接插入排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后. 设数组为a[0-n-1]. 1.      初始时,数组全为无序区为a[0..n-1].令i=0 2.      在无序区a[i-n-1]中选取一个最小的元素,将其与a[i]交换.交换之后a[0-i]就形成了一个有序区. 3.      i++并重复第二步直到i==n-1.

选择式排序法之选择排序法实现 -java版

计算算法时间复杂度比冒泡快一点 选择排序法核心思想是,第一次从R[0] ~R[n-1]中选择最小值然后与R[0]交换,第二次从R[1] ~R[n-1]中选取最小值与R[1]交换---第i次呢就是从R[i-1] ~R[n-1]中选取最小值,与R[i-1]元素交换:对于一个含有n个元素的数组,最多交换n-1次就得到了一个排序码从小到大的有序序列. package com.PengRong.A; import java.util.*; /** * * @author PengRong * */ pub

排序高级之选择排序_选择排序

选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换.在所有的完全依靠交换去移动元素的排序方

C语言排序算法之简单交换法排序,直接选择排序,冒泡排序

C语言排序算法之简单交换法排序,直接选择排序,冒泡排序,最近考试要用到,网上也有很多例子,我觉得还是自己写的看得懂一些. 简单交换法排序 1 /*简单交换法排序 2 根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置 3 交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动 4 不稳定 5 */ 6 #include<windows.h> 7 #include<stdio.h> 8 void main(){ 9 int i,j,arr[10

初级排序算法之选择排序

初级排序算法 本质是对要排序的数组进行嵌套循环,内层循环负责局部的排序,外层循环负责剩余的无序元素的递减.所以你只要理解嵌套循环和比较大小就能很快的掌握初级排序算法. 选择排序 一个无序的数组 a = [0, 4, 6, 3, 8, 2, 3, 9], 你也可以把a的元素想象成任何现实中可比较的具体物体.例如,有10根长短不一的木条,我们如何对它们进行排序?一个最直接的思想,先拿出最短的放到最前面,在剩余的木条中再拿出最短的放在第二位...直到最后一根木条.从中我们可以看出,1. 我们需要再一次