Java排序

转载自  https://blog.csdn.net/qq_39098813/article/details/79950444

几种排序算法的属性对比

这里写图片描述

一、冒泡排序

特点:效率低,实现简单 
原理:将待排序列中最大的数往后冒泡,成为新的序列,重复以上操作直到所有元素排列完成

public class PaiXu {

    public static void main(String []args) {

        maoPao(a);
    }

    /**
    *冒泡排序
    */
    public static void maoPao(int []array){
        int temp;//交换数据
        System.out.println("\n冒泡排序:");
        for(int i=1;i<array.length;i++) {   //只需要比较数组元素个数减一次
            for(int j=0;j<array.length-1;j++) {
                if(array[j]>array[j+1]) {
                    temp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=temp;
                }
            }
            System.out.print("第"+i+"次:");
            for(int i=0;i<array.length;i++) {
                System.out.print(array[i]+" ");
            }
            System.out.println();
        }
    }
  •  

这里写图片描述

二、选择排序

特点:效率低,容易实现。 
原理:每一趟从待排序序列选择一个最小的元素放到已排好序序列的首位,剩下的位待排序序列,重复上述步骤直到完成排序。

    /**
    *选择排序
    */
    public static void xuanZe(int []array) {
        int index,temp;
        System.out.println("\n选择排序:");
        for(int i=0;i<array.length-1;i++) {
            index=i;//用来记住数组元素的下标
            for(int j=i+1;j<array.length;j++) {
                if(array[index]>array[j]) {
                    index=j;//只对index值改变,不交换元素位置
                }
            }
            if(i!=index) {
                temp=array[index];
                array[index]=array[i];
                array[i]=temp;
            }//一轮排序进行一次数组位置交换
            System.out.print("第"+i+"次:");
            for(int i=0;i<array.length;i++) {
                System.out.print(array[i]+" ");
            }
            System.out.println();
        }
    }
  •  

这里写图片描述

有的人在排序时一遇到比已选择的元素大的元素就进行交换,这样交换的次数太多

以上方法采用的是记录该元素的下标,最终只需要将该下标指向的元素和需交换的元素交换即可,这样一轮排序只需要交换一次数组元素的位置

插入排序

特点:效率低,容易实现。 
原理:将数组分为两部分,将后部分元素逐一插入前部分有序元素的适当位置

    /**
    *插入排序
    */
    public static void chaRu(int []array) {
        int temp;
        System.out.println("\n插入排序:");
        for(int i=1;i<array.length;i++) {
            int j=i;
            temp = array[i];
            while( j>0 && temp < array[j-1]) {
                array[j] = array[j-1];
                j--;
            }
            array[j] = temp;
            System.out.print("第"+i+"次:");
            show(array);
        }
    }
  •  

这里写图片描述

快速排序

特点:高效,时间复杂度为nlogn。 
原理:采用分治法的思想:首先设置一个中间值,然后以这个中间值为划分基准将待排序序列分成比该值大和比该值小的两部分,将这两部分再分别进行快速排序 
直到序列只剩下一个元素

/**快速排序
     * */
    public static void kuaiSu(int []array,int left,int right){
        if(left < right) {
            int i=left,j=right;
            int pivot = array[left];//选择最左边的元素作为中间值

        /**
         * 分治
         */
        while(i < j) {
            while(i < j && array[j] >= pivot) {
                j--;
            }
            if(i < j) {
                array[i] = array[j];
                i++;
            }
            while(i < j&& array[i] < pivot){
                i++;
            }
            if(i < j) {
                array [j] =array [i];
                j--;
            }
        }
        array [i]=pivot;
        //递归
        kuaiSu(array,left,i-1);
        kuaiSu(array,i+1,right);
        }
    }

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值