常见排序算法原理简介

冒泡排序

在这里插入图片描述
相邻两个比较,重复多轮

1.将数组当中的左右元素,依次比较,保证右边的元素始终大于左边的元素;
( 第一轮结束后,序列最后一个元素一定是当前序列的最大值;)

2.对序列当中剩下的n-1个元素再次执行步骤1。

3.对于长度为n的序列,一共需要执行n-1轮比较(利用while循环可以减少执行次数)

快速排序

在这里插入图片描述

1.从数组当中选择一个基准数(pivot),这里选择第一个元素即可

2.将数组当中的所有数依次遍历(同时前后一起向中间遍历)

  • 假设第一个下标为 i,最后一个下标为 j,从后往前遍历 j-- ,直到遇到比基准数小的停下记录 j ,并将 j 对应值赋予 i 当前位置(第一次 i 所在位置是 基准数,即现在存在两个 j 对应值)
  • 从前往后遍历 i++,直到遇到比 基准数大的停下记录 i ,将 i 对应对值赋值给此时 j 对应位置(即此时存在两个 i 对应值)
  • 重复以上直到 i ,j 重合,即将原数组分为两部分

3.重复步骤1.2,直到所有子数组当中只有一个元素为止。

伪代码:
1).i =L; j = R; 将基准数挖出形成第一个坑a[i]。
2).j–由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
3).i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中

插入排序

在这里插入图片描述

  • 下标移动到哪排序到哪,即下标所到之处前面都是排序好的
  • 每次用下标所指元素跟前面的一个一个比较,大的后移直到遇到比他小/无 就停止并把进行判断的元素赋值给该位置的后一个位置
  • 下标从第二个开始就好了,因为默认下标前面都是有序的,第二个开始排序比较

希尔排序

在这里插入图片描述
使用步长,相隔 步长(total/2) 进行比较,将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;每次将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序。

  • 本质:插入排序
  • 1.确定步长
  • 2.根据步长分组
  • 3.插入排序
  • 4.递归前面步骤 直至步长为0

选择排序

在这里插入图片描述

简单选择排序的基本思想:
比较+交换。 每次只把未排序的元素中的最小/最大值 挑选出来与当前比较的轮数 i 对应的下标位置 arr[i] 交换。

1.从待排序序列中,找到关键字最小的元素;

2.如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;

3.从余下的 N - 1 个元素中,找出关键字最小的元素,重复(1)、(2)步,直到排序结束。

归并排序

在这里插入图片描述
适合于数据本身元素 部分有序

1.将一个数组分成两部分(一般从中间分开)

2.从这两部分各自的第一个元素开始比较,较小的值放入临时数组中,然后移动下标

3.重复比较。直到有一方的数据完全比较完,另一方剩下元素全部放入临时数组

4.最后将临时数组赋值给原数组。

基数排序

在这里插入图片描述
先通过个位数大小按顺序排序,形成新数据,再通过十位数大小按顺序排列,形成新数据,以此类推。

1.获取数组中最大的数字,计算最大数字的长度(几位数-用以控制循环次数)

2.把数组中的每一个元素都计算余数,根据最大数的长度来判断需要计算几轮(依次取个位数、十位数、百位数…)

3.将每次取到的余数放入对应的指定的二维数组中(temp[余数][相同余数数量])

4.最后按顺序取出元素(通过循环取出各个临时数组中的所有值 temp[k][l])

堆排序

堆的概念
堆:本质是一种数组对象。特别重要的一点性质:任意的叶子节点小于(或大于)它所有的父节点。对此,又分为大顶堆和小顶堆,大顶堆要求节点的元素都要大于其孩子,小顶堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系不做任何要求。

利用堆排序,就是基于大顶堆或者小顶堆的一种排序方法。升序排序使用大顶堆, 降序排序使用小顶堆
下面,我们通过大顶堆来实现。

基本思想:
堆排序可以按照以下步骤来完成:

1.首先将序列构建称为大顶堆;
(这样满足了大顶堆那条性质:位于根节点的元素一定是当前序列的最大值)
在这里插入图片描述
2.取出当前大顶堆的根节点,将其与序列末尾元素进行交换;
(此时:序列末尾的元素为已排序的最大值;由于交换了元素,当前位于根节点的堆并不一定满足大顶堆的性质)

3.对交换后的n-1个序列元素进行调整,使其满足大顶堆的性质;
在这里插入图片描述
重复2.3步骤,直至堆中只有1个元素为止
注意:每次根节点跟最小值交换后要重新构建大顶堆,如上图本来交换后 1 是根节点,但是经过重新构建后 1 还是位于下方而不是根节点位置。

各排序算法代码实现

Java代码实现排序算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值