Java——比较类排序

比较类排序:冒泡排序、选择排序、插入排序(希尔排序)、归并排序、堆排序、快速排序(二路快排、三路快排)

一、冒泡排序

原理(步骤):
(a)比较相邻的元素,如果第一个比第二个大,就交换。对每一对相邻元素做相同的操作。
(b)一轮结束后,最后的元素应该是当轮中最大的。
(c)下一轮循环时,从第一个元素开始比较,到上一轮比较出的最大元素的前一个结束。
(d)直到没有任何一个数字需要比较,说明已排序好。

稳定排序:比较是相邻两个元素比较,交换也发生在这两个元素之间,所以相同元素的前后顺序没有发生改变。

时间复杂度:O(n^2)

示意图

参考代码

import java.util.Arrays;
class BubbleSort{
    public static void main(String[] args){
        int[] a={6,4,9,1,8,3,2,7,5};
        //一共比较几轮
        for(int i=0;i<a.length-1;i++){
            //一轮的比较次数,从第一个元素开始,到上一轮最后一个元素的前一个结束
            for(int j=0;j<a.length-1-i;j++){
                if(a[j]>a[j+1]){
                    //交换元素
                    swap(a,j,j+1);
                }
            }
        }
        System.out.println(Arrays.toString(a));
    }
    public static void swap(int[] a,int i,int j){
        //方法一:中间值(通用的)
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
        
        //以下是另外两种交换数字的方法

        //方法二:加减法(仅适用于数字)
        /*
        //a[i]=6,a[j]=4
        a[i]=a[i]+a[j];//10
        a[j]=a[i]-a[j];//a[j]=6
        a[i]=a[i]-a[j];//a[i]=4
        */
        
        
        //方法三:异或(仅适用于数字)
        /*
        a[i]=a[i]^a[j];
        a[j]=a[i]^a[j];
        a[i]=a[i]^a[j];
        */
        
    }
}
二、选择排序

原理(步骤)
(a)当前数字与后面每一个元素比一下,当前数字大,交换
(b)一轮结束后,最小元素以产生
(c)下一轮循环,从上一轮比较出最小元素的后一个开始,到最后一个元素结束
(d)直到第n-1个元素,不需要选择了,排序已排好。

不稳定排序:选择排序会改变相同元素的前后顺序。
例如:序列{6,8,6,2,9},第一轮循环,第一个6和2会交换,两个6的顺序已经发生了改变。

示意图

参考代码

import java.util.Arrays;
class SelectSort{
    public static void main(String[] args){
        int[] a={6,4,9,1,8,3,2,7,5};
        //一共比较几轮
        for(int i=0;i<a.length-1;i++){
            //一轮的比较次数,从上一轮得出最小的元素的后一个开始,到最后一个元素结束
            for(int j=i+1;j<a.length;j++){
                if(a[i]>a[j]){
                    //交换元素
                    swap(a,i,j);
                }
            }
        }
        System.out.println(Arrays.toString(a));
    }
    public static void swap(int[] a,int i,int j){
        //中间值(通用的)
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
}
三、插入排序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值