Java基础 排序算法

        概述:排序算法,即通过特定的算法因式将一组或多组数据按照既定模式进行重新排序。这种新序列遵循着一定的规则,体现出一定的规律,因此,经处理后的数据便于筛选和计算,大大提高了计算效率。

常见的有:冒泡排序、选择排序、插入排序、快速排序、堆排序、归并排序、希尔排序、基数排序等。

1、冒泡排序

        概述:冒泡排序可以说是排序算法中最为简单的一种。

        它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

        这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样(这是因为组成小气泡的二氧化碳比水要轻,所以小气泡可以一点一点向上浮动。),故名“冒泡排序”。

        排序核心思想: 相邻元素做比较,两两比较小靠前。

        1.将相邻的两个元素进行比较,比较完后,按照元素大小进行移位,小的移动到前面,大的移动到后面。2.每一轮比较完后,"最大的元素" 将被移位到最后。在下一轮比较的时候,这个 "最大的元素" 就不需要再参与比较了。3.重复进行上述步骤,经过 N - 1 轮比较之后,排序完成。(N:代表的是要比较的元素个数)

例:

int[] arr = {23, 32, 12, 21, 19, 91};
for (int i = 0; i < arr.length - 1; i++) {
    for (int j = 0; j < arr.length - 1 - i; j++) {
        if (arr[j] > arr[j + 1] ) {
            int temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}
System.out.println(Arrays.toString(arr));//输出结果[12, 19, 21, 23, 32, 91]

2、选择排序

        概述:它是一种简单直观的排序算法。

        它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。

        以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

        排序核心思想: 打擂台求最小值思路。

        1.第一次比较的时候,先将 "第一个元素" 假定为最小元素值。2.然后将第一个元素依次和后面的所有元素进行比较大小,如果后面的元素比第一个元素小,则进行交换。3.每一轮比较完后,"最小的元素" 将被移位到 "第一个元素位置"。在下一轮比较的时候,这个 "最小的元素" 就不需要再参与比较了。4.重复的进行上面步骤,经过 N - 1 轮比较之后,排序完成。(N:代表的是要比较的元素个数)

例:

int[] arr = {23, 32, 12, 21, 19, 91};
for (int i = 0; i < arr.length - 1; i++) {
    for (int j = i + 1; j < arr.length; j++) {
        if (arr[i] < arr[j]) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
}
System.out.println(Arrays.toString(arr));//输出结果[91, 32, 23, 21, 19, 12]

3、插入排序

        概述:一般也称为直接插入排序。对于少量元素的排序,它是一个有效的算法。

        插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

        排序核心思想: 在有序数列中做插入,并保持住有序。

        1.首先将第一个元素就看作是一个已经排序好的数列,后面的其他元素则看作未排序数列。{{a1}, {a2, a3, a4, ..., an}}

        2.然后将第二个元素在已经排序好的数列中,做插入动作。即在已经排序好的数列中,从后向前依次查找符合升序规律的位置,并插入到该位置。这样新的已经排序好的数列就变为了:{{a1, a2}, {a3, a4, ..., an}}

        3.重复这个步骤,直到排序结束。

例:

int[] arr = {23, 32, 12, 21, 19, 91};
for (int i = 1; i < arr.length; i++) {
    for (int j = i; j > 0 ; j--) {
        if (arr[j] > arr[j - 1]) {
            int temp = arr[j - 1];
            arr[j - 1] = arr[j];
            arr[j] = temp;
        }
    }
}
System.out.println(Arrays.toString(arr));//输出结果[91, 32, 23, 21, 19, 12]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值