数组排序

对数组进行排序是程序中非常基本的需求。常用的排序算法有冒泡排序、插入排序和快速排序等。

我们来看一下如何使用冒泡排序算法对一个整型数组从小到大进行排序:

shuzupaixu\_1.png

冒泡排序的特点是,每一轮循环后,最大的一个数被交换到末尾,因此,下一轮循环就可以“刨除”最后的数,每一轮循环都比上一轮循环的结束位置靠前一位。

另外,注意到交换两个变量的值必须借助一个临时变量。像这么写是错误的:

int x = 1;
int y = 2;
x = y; // x现在是2
y = x; // y现在还是2

正确的写法是:

int x = 1;
int y = 2;
int t = x; // 把x的值保存在临时变量t中, t现在是1
x = y; // x现在是2
y = t; // y现在是t的值1

实际上,Java的标准库已经内置了排序功能,我们只需要调用JDK提供的Arrays.sort()就可以排序:

shuzupaixu\_2.png

必须注意,对数组排序实际上修改了数组本身。例如,排序前的数组是:

int[] ns = { 9, 3, 6, 5 };

在内存中,这个整型数组表示如下:

    ┌───┬───┬───┬───┐
ns───>│ 9365 │
    └───┴───┴───┴───┘

当我们调用Arrays.sort(ns);后,这个整型数组在内存中变为:

    ┌───┬───┬───┬───┐
ns───>│ 3569 │
    └───┴───┴───┴───┘

即变量ns指向的数组内容已经被改变了。

如果对一个字符串数组进行排序,例如:

String[] ns = { "banana", "apple", "pear" };

排序前,这个数组在内存中表示如下:

                 ┌──────────────────────────────────┐
             ┌───┼──────────────────────┐           │
             │   │                      ▼           ▼
       ┌───┬─┴─┬─┴─┬───┬────────┬───┬───────┬───┬──────┬───┐
ns ─────>│░░░│░░░│░░░│   │"banana"│   │"apple"│   │"pear"│   │
       └─┬─┴───┴───┴───┴────────┴───┴───────┴───┴──────┴───┘
         │                 ▲
         └─────────────────┘

调用Arrays.sort(ns);排序后,这个数组在内存中表示如下:

                 ┌──────────────────────────────────┐
             ┌───┼──────────┐                       │
             │   │          ▼                       ▼
       ┌───┬─┴─┬─┴─┬───┬────────┬───┬───────┬───┬──────┬───┐
ns ─────>│░░░│░░░│░░░│   │"banana"│   │"apple"│   │"pear"│   │
       └─┬─┴───┴───┴───┴────────┴───┴───────┴───┴──────┴───┘
         │                              ▲
         └──────────────────────────────┘

原来的3个字符串在内存中均没有任何变化,但是ns数组的每个元素指向变化了。

练习

请思考如何实现对数组进行降序排序:

shuzupaixu\_3.png

下载练习:降序排序练习 (推荐使用IDE练习插件快速下载)

小结

常用的排序算法有冒泡排序、插入排序和快速排序等;

冒泡排序使用两层for循环实现排序;

交换两个变量的值需要借助一个临时变量。

可以直接使用Java标准库提供的Arrays.sort()进行排序;

对数组排序会直接修改数组本身。

读后有收获可以支付宝请作者喝咖啡,读后有疑问请加微信群讨论

shuzupaixu\_4.pngshuzupaixu\_5.png

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""