[Java教程]16.数组的排序算法

Java教程专栏:https://blog.csdn.net/qq_41806966/category_9929686.html

hello,I'm shendi

本节学习如何让 int 类型数组排序


目录

 

排序

冒泡排序

选择排序

插入排序

睡眠排序

练习


排序

排序是指将一堆元素按照一定的规则进行排列.

例如一堆数字,我们可以由大到小或者由小到大进行排序

 之前学过数组,现在我们就来学习一下 int 类型的数字进行排序(由大到小,由小到大)

---不会排序的等价于没学过数组?

排序算法有很多种,例如冒泡排序,选择排序等,这里我抽几个来讲解


冒泡排序

什么是冒泡排序?

按照数 从小到大 进行排序的话, 冒泡排序就是 从第一个元素开始,和后面那个元素进行比较,看后面的是否大于我,大于我们就换位置.

然后第二个元素和第三个比,第三个和第四个,这样两个相邻的元素进行比较.

经过一次循环数组后,我们可以把最大的数给找出来

例如 现有数组 [1,4,3,2,5]

冒泡排序是两个相邻元素进行比较,我们要从小到大排序,所以第一次判断 1 和 4.

1 < 4,所以位置不变,第二次就是判断 4 和 3.

4 > 3 所以我们要让这两个元素位置互换一下, 所以现在数组变为

[1,3,4,2,5]

接着在判断 4 和 2.

4 > 2,所以我们也需要把位置进行移动,现在数组变为

[1,3,2,4,5]

最后 4 和 5进行比较.

4 < 5,所以不变,一次循环完成,我们成功获取到了最大的那个数--5

一次循环数组可以找到最大的数,那么第二次是不是找到第二大的数? 根据这个思想,实现的代码就是冒泡排序代码了

第二次数组排序, 1 和 3 比较 1 < 3,不做操作

3 和 2 比较, 3 > 2 移动一下位置,数组变为

[1,2,3,4,5] 现在已经排序好了,但是我们的程序是无法知道数组是否是排序的,所以还会做多余的动作(没办法的事情)

然后3和4比较,4和5比较, 然后第三次循环,第四次...

画张图就是这样的

正常的冒泡排序算法代码如下

int[] arr = {1,3,2,4,5,7,6};
for (int i = 0;i < arr.length - 1;i++) {
    for (int j = 0;j < arr.length - 1;j++) {
        if (arr[j] > arr[j + 1]) {
			int temp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = temp;
		}
    }
}

我们会发现上面代码有很多重复动作,我们优化一下,编写成代码如下

上面的函数既可以从大到小排序也可以从小到大排序,而且比之前的高效.


选择排序

选择排序是最直观的一种排序算法.

简单地说,就是循环,找到最大/最小的那个数,和第一个位置进行交换,然后找第二个,第三个..

例如 现有数组 [6,5,4,3,2,1]

我们从小到大进行排序,使用选择排序的话

先判断6 是否大于 5 大于则记录一下 5 的 位置,

然后 5 大于 4,将之前记录的位置变为4的位置

4>3,记录3的位置,3>2,记录2的位置,2>1,记录1的位置

最后将 1 的位置换到位置 0(数组的第一个位置),然后6就到最后去了

现在的数组内容为 [1,5,4,3,2,6]

接下来就是判断5 是否 大于 4,大于记录4的位置...记录3位置,2位置

2<6 所以不用将位置替换为6. 也就是第二小的是 2,所以将2的位置替换到位置 1

现在数组内容为 [1,2,4,3,5,6]

然后接下来就是判断 4 和 3 ,4 > 3 记录 3 位置,然后3 < 5 不记录, 3< 6 不记录,第三小的是3.

现在数组内容为[1,2,3,4,5,6]

现在已经完成排序,但是还会进行操作, 从4开始,判断 4 是否大于 5,4 是否大于 6...不做操作

画张图就是这样的

选择排序的一般代码如下

int[] arr = {6,5,4,3,2,1};
int minIndex = 0;
for (int i = 0;i < arr.length - 1;i++) {
    minIndex = i;
    for (int j = i;j < arr.length;j++) {
        if (arr[minIndex] > arr[j]) {
            minIndex = j;
        }
    }
    if (minIndex != i) {
        int temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
}

插入排序

插入排序通俗一点讲就是将数抽出来, 然后判断 前一个/后一个 是否 大于/小于 自己,是就将 前一个/后一个 换到自己的位置,然后将自己的位置往前/后 移,然后再判断...直到条件不成立为止

先画一张简单的图

可以很容易看出此排序的原理,就是先将当前数保存起来,然后判断当前数是否大于之前/之后那个数...

代码如下


除了以上几种排序外还有很多排序,这里在列举一个奇葩的排序(知道就好了,千万不要用这个排序)

睡眠排序

后面我们学到线程会知道什么是睡眠,现在只要知道,睡眠就是让程序指定时间内不运行 就可以了

仅供娱乐

既然我们的数组为 int 类型,并且目的是排序,那么我们用睡眠的方法也可以进行排序(从理论上讲是没有问题的,但是间隔太近就会出问题)

睡眠排序可以 从小到大排序(只能这样)

具体思路就是, 每一个数字都是一个元素(比作一个人), 数字大小决定了这个人睡多久, 这样,我们只要让这个人在睡眠醒来后立马说出自己的数字就可以了.

代码如下

 

运行结果

练习

写一个自己专用的 数组 排序 工具类, 不仅仅有 int 数组的排序,也可以有字母(a-z,A-Z)...

下一节我们来实战一下,巩固之前的知识,完成第一个看得过去的小程序,猜拳.

猜你喜欢

转载自blog.csdn.net/qq_41806966/article/details/106728252