Java 用数组和循环实现排序算法

在解决某些问题的,我们需要对数据处理,排序就是一种处理方式

那如何将一些无序的数字排序成有序的呢?

我们知道当数据较多情况会使用数组来存储,利用角标也方便对数据的处理

较简单的排序方法有冒泡排序、选择排序、插入排序和计数排序,接下来我说明这4种排序:

冒泡排序:

总的来说就是相邻两个数之间比较,前者比后者大则两数交换位置

第一轮比较后最大值9就出来了

同理过多轮的操作较大的数一个个到最后面,就如冒泡一样。

代码如下:

    public static void bubble(int[] arr){
        for(int i=0;i<=arr.length-1;i++){
            for(int j=0;j+1<=arr.length-1-i;j++){
                if(arr[j]>arr[j+1]){
                    swap(arr,j,j+1);
                }
            }
        }
    }
    public static void swap(int[] arr,int i,int j){
        int temp;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

选择排序:

一个位置的数与它后面的数做比较,若后面的数较小,则交换位置

上图是最小值1和第二小的值2排序出的流程

同原理,从小到大的数就会被选出来了

代码如下:

    public static void select(int[] arr){
        for(int i=0;i<=arr.length-1;i++){
            for(int j=i+1;j<=arr.length-1;j++){
                if(arr[i]>arr[j]){
                    swap(arr,i,j);
                }
            }
        }
    }
    public static void swap(int[] arr,int i,int j){
        int temp;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

插入排序:

一个位置的数与之前的数比较,若此位置的数较小,则交换位置

代码如下:

    public static void insert(int[] arr){
        for(int i=1;i<=arr.length-1;i++){
            for(int j=0;j<=i-1;j++){
                if(arr[i]<arr[j]){
                    swap(arr,i,j);
                }
            }
        }
    }
    public static void swap(int[] arr,int i,int j){
        int temp;
        temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

以上三种排序方法的时间复杂度都为O(n^{2})级别

计数排序:

而计数排序它的时间复杂度为O(n)级别,它的原理不是比较数字的大小,而是创建一个新的数组将数字与角标匹配,记录数组出现的次数。然后遍历新数组,根据记录的次数,输出相匹配的角标。是典型的用空间换取时间的思想。

这种方法只能针对整数来做。

代码如下:

    public static void digitsSort(int[] arr){
        int offset=arrmin(arr);
        int[] newarr=new int[arrmax(arr)-offset+1];
        for(int i=0;i<=arr.length-1;i++){
            newarr[arr[i]-offset]++;
        }
        for(int i=0;i<=newarr.length-1;i++){
            for(int j=1;j<=newarr[i];j++){
                System.out.print(i+offset+" ");
            }
        }
    }
    //找arr[]数组中的最大值
    public static int arrmax(int[] arr){
        int max = arr[0];
        for(int i=1;i<=arr.length-1;i++){
            if(arr[i] > max){
                max = arr[i];
            }
        }
        return max;
    }
    //找arr[]数组中的最小值
    public static int arrmin(int[] arr){
        int min = arr[0];
        for(int i=1;i<=arr.length-1;i++){
            if(arr[i]<min){
                min = arr[i];
            }
        }
        return min;
    }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值