java数组排序

这篇博客详细介绍了七种常见的排序算法:冒泡排序、插入排序、选择排序、快速排序、归并排序、计数排序和桶排序。每种排序算法的原理、过程和代码实现都有清晰的解释,特别是对于快速排序和归并排序等复杂算法,博主提供了易懂的例子帮助理解。这七种排序算法在不同场景下各有优势,对于后端开发者掌握排序算法具有重要价值。
摘要由CSDN通过智能技术生成

冒泡排序

冒泡排序是每个后端开发人员必须掌握的排序算法,也是最容易理解的排序算法。主要使用嵌套循环,假设数组长度为10,以从小到大排序为例,内层循环中,将相邻的元素进行比较,比较后将较大的数向后移(例如array[0]大于array[1],则交换二者的位置),每执行完一次内层循环,则将最大的元素放到数组的末尾。则执行9(数组长度-1)次内层循环,则确定了9个数的位置,自然最后一个数的位置也确定了。
例如有数组{5,239,9,1,534,23,99,86,53,6},内层循环依次比较下标为0和下标为1,1和2,2和3……,若下标小的对应的元素值大,则交换位置,因此,第一次内层循环执行完成后534就移动到了最末尾,第二次内层循环就不用考虑最后一个元素了,即将239放到倒数第二个位置,9次执行完毕即完成排序。
具体看以下代码

package com.harbor.sort;

import java.util.Arrays;

/**
 * 冒泡排序
 * @author harborGao
 * @create 2020/3/7
 */
public class BubbleSort {
   
    public static void main(String[] args) {
   
        int[] arr = {
   5,239,9,1,534,23,99,86,53,6};
        bubbleSort(arr); //数组进行冒泡排序
        System.out.println(Arrays.toString(arr));  //输出排序后的数组
    }

    /**
     * 冒泡排序
     * @param arr 待排序的数组
     */
    public static void bubbleSort(int[] arr){
   
        int len = arr.length; // 获取数组元素的个数
        boolean flag = true; //内层循环中if语句没有执行则说明排序已完成
        //循环执行len-1次,每次循环确定一个元素的位置,i即为以确定位置元素的个数
        for(int i = 0; i < len-1; i++){
   
            for(int j = 0; j < len-i-1; j++){
    //内层循环将最大的元素放到最末尾的位置
                if(arr[j] > arr[j+1]){
   
                    swap(arr,j,j+1);
                    flag = false; //说明排序有可能还没有完成
                }
            }
            if(flag)
                return;
        }
    }

    /**
     * 交换两个变量的值
     * @param arr
     * @param i
     * @param j
     */
    public static void swap(int[] arr,int i,int j){
   
        //写法一
//        int temp = arr[i];
//        arr[i] = arr[j];
//        arr[j] = temp;
        //写法二
//        arr[i] = arr[i]+arr[j];
//        arr[j] = arr[i]-arr[j];
//        arr[i] = arr[i]-arr[j];
        //写法三
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }
}

注意:此代码中有一个布尔类型变量flag,是对冒泡排序的一种优化,执行内层循环之前初始化其为true,若内层循环执行完成flag依然为true(if语句块没有执行),则说明排序已经完成。即可跳出外层循环!

插入排序

插入排序与冒泡排序可以说有异曲同工之妙,同样也是使用嵌套循环,只是内部逻辑发生了一点变化。假设要长度为10的数组arr进行插入排序,我们可以理解为次数组中只有一个元素arr[0],我们需要将其余的9个元素插入其中,则我们可以遍历下标为1到9的9个元素依次进行插入。所以,外层循环即为对数组的遍历,内层循环则做插入操作
1.arr[1]的插入我们需要比较他与arr[0]到底谁大,若arr[1]较大,我们则直接插入即可,若arr[1]较小,我们则需要交换其与arr[0]的位置。
2然后,我们需要插入arr[2],则内层循环需要先和arr[1]进行比较,若较大,则不需要移动。若较小,我们需要与arr[1]交换位置,并且再继续与arr[0]比较,若小于arr[0],则还需要与arr[0]交换位置。
3.接下来的7个元素执行同样的操作即可
例如,有数组arr = {56,9,53,1,56,9,55,76,531,222};我们可以看做数组中只有一个元素56,则将其他9个元素依次插入
1.插入9,我们与56比较,发现9<56,我们则需要交换位置
2.插入53,此时数组为{9,56,……},我们与56比较大小,发现53<56,则交换二者位置,我们再与9比较,发现53>=9,则不需要交换位置
3.剩下7个元素也是做同样的操作

具体实现代码如下:

package com.harbor.sort;

import java.util.Arrays;

/**
 * 插入排序
 * @author harborGao
 * @create 2020/3/7
 */
public class InsertSort {
   
    public static void main(String[] args) {
   
        int[] arr = {
   56,9,53,1,56,9,55,76,531,222};
        insertSort(arr); //数组进行插入排序
        System.out.println(Arrays.toString(arr)); //输出排序后的数组
    }

    /**
     * 插入排序
     * @param arr 传入的数组
     */
    public static void insertSort(int[] arr){
   
        int len = arr.length; //获取数组的长度
        //从第二个元素开始与前面的数组比较,若比前面的小,则交换位置
        for(int i = 1; i < len; i++){
   
            for(int j = i - 1; j >= 0; j--){
   
                //下标为i的元素依次与小于下标i的元素比较,若小于,则交换
                if(arr[j+1
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值