Java---八大排序

数组概念

  • 数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。数组既可以存储基本数据类型,也可以存储引用数据类型。
    什么是数组的初始化
    什么是数组的初始化

  • 数组初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。初始化的分类:
    a:动态初始化: 只指定长度,由系统给出初始化值
    b:静态初始化: 给出初始化值,由系统决定长度

//动态初始化:
int[] arr = new int[5];
int arr[] = new int[5];

//静态初始化:
int[] arr = new int[]{1,2,3,4};
int arr[]={1,2,3,4};   //简写

int[] g,z[];  //代表定义了两个数组,一个一维数组g一个二维数组z
g=new int[1];
z=new int[2][2];

数组的常见排序算法

  • 排序:把一个无序序列通过某种方式变成一个有序序列
    1.冒泡排序
  • 通过第一轮比较,将最大或最小的值交换到数组最后的位置
  • 然后层层比较使得数组有序
    在这里插入图片描述
    2.选择排序
  • 由第一个数开始,与数组后面的数逐一比较,后小则交换位置,一轮结束最小数交换到最前面,多轮交换后数组有序
    在这里插入图片描述
    3.插入排序
  • 从1索引开始,将后面数据循环插入之前有序数组中,插入数据后数组仍然有序
    在这里插入图片描述
    4.希尔排序(缩小增量排序)
  • 是对插入排序的一个优化,核心的思想就是合理的选取增量,经过一轮排序后,就会让序列大致有序
  • 然后再不断的缩小增量,进行插入排序,直到增量为1那整个排序结束(直接插入排序,其实就是增量为1的希尔排序)
  • 合理的选取这个增量,可以第一次增量选取数组长度的一半,然后不断的减半,但这样不是很好,可以使用克努特序列:
//克努特序列 : 
int h=1;
h=h*3+1;  //1,4,13,40,121,364

5.快速排序

  • 分治法:比大小,再分区
    1.从数组中取出一个数,作为基准数。
    2.分区:将比这个数大或等于的数全放到他的右边,小于他的数全放到他的左边。
    3.再对左右区间重复第二步,直到各区间只有一个数。
    6.归并排序
  • 就是利用归并的思想实现排序的方法。原理是假设初始序列有N个记录,则可以看成是N个有序的子序列,每个子序列的长度为1,然后两两归并,得到N/2个长度为2或1的有序子序列,再两两归并…如此重复,直至得到一个长度为N的有序序列为止,这种排序方法称为二路归并排序。如图示:
    在这里插入图片描述
    7.基数排序(桶排序)
    基数排序的实现不需要进行对关键字的比较,只需要对关键字进行“分配"与“收集"两种操作即可完成。
    8.堆排序
  • 基本思想 :
    1.将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。
    ⒉将其与末尾元素进行交换,此时末尾就为最大值。
    3.然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。
    4.如此反复执行,便能得到一个有序序列了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值