java数组 排序(冒泡、选择、快速)示例

1.数组的介绍

数组:一组类型相同的数据

1.为什么不能存放不同的数据类型?
每种数据类型在内存空间中占据的大小不同

2.为什么要用到数组?
业务所需,需要对多个同种数据类型的数据进行打包处理。

2.排序的介绍

排序是将一群数据,按照指定的顺序进行排列的过程。

3.排序的分类

内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序、选择排序和插入排序)

外部排序:数据量过大,无法加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)

3、排序(Sorting)是数据处理中一种很重要的运算,同时也是很常见的运算,一般数据处理工作的25%的时间都是在进行排序。简单地讲,排序就是把一组记录(元素)按照某个域的值的递增或者递减的次序重新排列的过程。

4.遍历数组的三种方法

 private static void fun1(int[] arr) {
        for(int i=0;i<arr.length;i++){//1.for循环遍历数组
            System.out.println(arr[i]);
        }
        for(int i:arr){//2.增强for循环遍历数组
            System.out.println(i);
        }
        System.out.println(Arrays.toString(arr));
        //3.调用方法遍历数组
    }

5.向数组中插入数据

import java.util.Arrays;

public class Demo02 {
    public static void main(String[] args) {
        fun1();
    }
    //向数组中插入一个数据
    private static void fun1() {
        int [] arr = {10,20,30,40,50,60,70,0};
        int x = 10;//要进行插入的数据
        //1.查找应插入的下标
        int index=arr.length-1;
        //因为没有到数组最后一个,所以默认为最后一个
        for(int i=0 ; i<arr.length ; i++){//遍历数组
            if(arr[i]>x){
                index=i;//记录插入下标
                break;//结束循环
            }
        }
        //2.数组从index开始向后移动一位
        for(int i=arr.length-2;i>=index;i--){
            arr[i+1]=arr[i];
        }
        //3.插入数据替换arr[index]
        arr[index]=x;
        //输出数组
        System.out.println(Arrays.toString(arr));
    }
}

6.冒泡排序

原理:每次比较两个相邻的元素,将较大的元素交换至右端。

思路:每次冒泡排序操作都会将相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足,就交换这两个相邻元素的次序,一次冒泡至少让一个元素移动到它应该排列的位置,重复N次,就完成了冒泡排序。
在这里插入图片描述

public class Demo02 {
    public static void main(String[] args) {
        //冒泡详解
        int [] arr={3,4,5,2,6,1};
        for(int i=1;i<arr.length;i++){
            //第一轮循环,次数arr.length-1,
            for(int j=0;j<arr.length-i;j++){
                //第二轮循环,次数arr.length-i,
                // 作用:循环一次比较出一个最大数,移动到后面
                if(arr[j]>arr[j+1]){
                    //arr数组中前一个数比后一个数大时,交换两个数位置
                    int t=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=t;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

7.选择排序

1:外层循环:要走几趟,同样是length-1。
2:设置一个最小值。假设第一个就是最小值。
3:设置一个最小值下标
4:内层循环:那你当前的最小值去逐一比较。当有比当前最小值小的数时,记录最小值,记录下标。
5:退出内层循环后就交换位置。
在这里插入图片描述

public class Demo03 {
    //选择排序
    public static void main(String[] args) {
        int [] arr={3,4,5,2,1,6,7,8};
        //1.找下标
        for(int i=0;i<arr.length-1;i++){
            int min=i;//定义一个最小数的下标
            for(int j=i;j<arr.length;j++){
                if(arr[j]<arr[min]){//比较大小,获取最小数下标
                    min=j;
                }
            }
            int t=arr[min];
            arr[min]=arr[i];
            arr[i]=t;
        }
        System.out.println(Arrays.toString(arr));
    }
}

8.快速排序

交换式排序法–快速排序法

基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,
整个排序过程可以递归进行,以此达到整个数据变成有序序列。
在这里插入图片描述

 public static void main(String[] args) {
        int [] arr={9,6,5,48,2,3,4};
        System.out.println(Arrays.toString( quickSort(arr,0,arr.length-1)));
    }
    //快速
    private static int [] quickSort(int arr[],int l,int r) {//l:表示数组的第一个下标 r:表示数组的最后一个下标
        int X=arr[l];   //基准,划分大于X的一边和小于X的一边
        int i=l,j=r;    //第一次:i=0 , j=arr.length-1
        while (i<j){                    //循环满足条件跳出循环
            //从右向左,找出比X小的数的下标 j
            while (i<j&&arr[j]>X){      //查找比X大的数arr[j],并且j向右移动一步
                j--;
            }
            //从左向右,找出比X大的数的下标
            while (i<j&&arr[i]<X){      //查找比X小的数arr[i],并且i向左移动一位
                i++;
            }
            if(arr[i]==arr[j]&&i<j){        //不同下标,i++
                i++;
            }else {                 //交换数据,比X小到左边,比X大到右边
                int t=arr[i];
                arr[i]=arr[j];
                arr[j]=t;
            }
        }
        if(i-1>l){                  //满足i-1>l,调用方法,改变arr.length-1-----变成i-1
            arr=quickSort(arr,l,i-1);
        }
        if(j+1<r){                  //满足j+1<r,调用方法,改变0------变成j+1
            arr=quickSort(arr,j+1,r);
        }
        return arr;
    }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值