初识Java——排序

排序

数组是任何计算机语言中非常重要的知识点,在数组中非常重要的知识点就是排序,简称重中之重。排序为什么这么重要呢?首先,排序是我们最先接触到的算法,至于算法的重要性我就不多说了,学好排序能够有助于培养我们的算法思想。其次,排序的种类有很多,因此它能够解决我们遇到的许多难题。最后,排序能够有效的训练我们打代码的能力。因此,学好排序是至关重要的。

排序的方法有很多种:选择排序、冒泡排序、插入排序、归并排序、堆排序、快速排序(二路排序、三路排序)、计数排序、基数排序、桶排序,但是这一次只总结了选择排序、冒泡排序、插入排序、计数排序,因为其他的难度较大,现在还有些吃力。

冒泡排序

那先从冒泡排序说起吧,因为冒泡排序比较简单,先易后难嘛,嘿嘿。

冒泡排序的原理:重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。一直重复直到不再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。那是如何比较两个元素的呢?很简单,就是比大小。如果前一个数字比后一个数字大的话,两者就要交换位置,直到最后两个数字比较完毕,这样,当前最大的数就排在最后,但是一次只能确定一个最大的数字,因此,这个数组有多少个元素就要比较 [ 元素-1 ] 轮,因为最后一轮是和自己比较,没有意义,所以可以省略。

一大段的文字可能很难理解这个原理,那么就用一张图来说明一下:

代码如下:

public static void bubbleSort(int[] arr){
    int len=arr.length;
    int k=0;
    for(int i=0;i<len-1;i++){
        for(int j=0;j<len-i-1;j++){
            if(arr[j]>arr[j+1]){
                k=arr[j+1];
                arr[j+i]=arr[j];
                arr[i]=k;
            }
        }
    }
}
            

 

选择排序

选择排序是一种比较直观的排序方法,也就是说更容易我们大家理解。

选择排序的原理:当前元素和之后所有的元素进行比较,如果前者大于后者,则交换。也就是说,每次寻找的都是序列中的最小值,然后放在最前面的位置。这和冒泡排序敲好相反,但是因为是一一进行比较,所以比较直观,利于理解。

下面还是用一张图来说明一下:

代码如下:

public static void selectSort(int[] arr){
    int len=arr.length;
    int k=o;
    for(i=0;i<len-1;i++){
        for(int j=i+1;j<len;j++){
            if(arr[i]>arr[j]){
                int temp;
                temp=arr[i];
                arr[i]=arr[j];
                arr[j]=temp;
                

 

插入排序

插入排序的工作原理:确认一个数字的左边有数字,然后比较两个数字大小,若是左边的数字大,则交换两个数字的位置。

代码如下:

public static void insertSort(int[] arr){
    int e;
    int j;
    for(int i=1;i<arr.length;i++){
        int e=arr[i];
        for(int j=i;j>0&&arr[j-1]>e;j--){
            arr[j]=arr[j-1];
        }
        arr[j]=e;
    }
}

 

计数排序

假设n个输入,每个都是介于0到k的整数。计数排序的基本思想是对每一个输入元素x,确定出小于x的元素个数。有了这一信息,直接x放到对应的位置上就行了。比如说有5个元素小于x,那就把x放到第六个位置上。当有元素相等时,需要略作修改,因为不能把他们都放在同一个位置上。

代码如下:

public static void countSort(int[] arr){
    int min=arr[0];
    int max=arr[0];
    for(int i=0;i<arr.length;i++){
        if(arr[i]<min){
            min=arr[i];
        }
        if(arr[i]>max){
            max=arr[i];
        }
    }
    int[] nums=new [max-min+1];
    int offset=min;
    for(int i=0;i<arr.length;i++){
        nums[arr[i]+offset]++;
    }
    int index=0;
    for(int i=0;i<arr.length;i++){
        if(nums[i]!=0){
            for(int j=0;j<nums[i];j++){
                arr[index]=i+offset;
            }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值