七种基于比较的排序,基于Java实现,收藏一下?

本文详细介绍了七种基于比较的排序算法在Java中的实现,包括简单插入排序、冒泡排序、简单选择排序、堆排序、希尔排序、快速排序和归并排序。文章重点讨论了每种算法的原理、代码实现及性能分析,同时提及了JDK中提供的排序方法和海量数据的排序策略。
摘要由CSDN通过智能技术生成

一.总览

 

二.基于比较的排序算法

1.简单插入排序(重点)

注意:区间较小时,最快
原理:
一组数据array[],认为以下标i为分界,[0,i+1)认为有序,[i+1,array.length)无序,从无序数据中每次取出一个数据,插入有序数据中


代码实现:

 public static void insertSort(long []array){
        //数据一共有array.length个
        //所以,子操作需要执行array.length次
        //减不减一都可以,减一认为第一个数已经有序
        for (int i = 0; i <array.length-1 ; i++) {
            //有序[0,i+1)  例如刚开始[0,1)有序
            //无序[i+1,array.length)
            //抓取出来的数是[i+1]

            long key=array[i+1];
            int j=0;
            //依次在有序区间进行比较
            for ( j = i; j>=0 ; j--) {
                //[j]就是需要和key比较的数
                /**
                 * key<array[j]   把array[j]往后移 继续往前比较
                 * key==array[j]  把key放入array[j]的后边
                 * key>array[j]   把key放入array[j]的后边
                 */
                if(key<array[j]){
                    array[j+1]=array[j];
                }else {
                    break;
                }
            }
            array[j+1]=key;

        }
    }

性能分析:
 

2.冒泡排序(重点)

原理:

在无序区间,通过相邻数的比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序

无序区间:[0,array,length-i)

有序区间:[array.length-i,array.length)

从下标j开始,将其与下标j+1依次比较,如果大于,交换。

代码实现:

public static void bubblingSort(long []array){
    //外层循环,需要多少次冒泡的过程
        for (int i = 0; i <array.length ; i++) {
            //无序区间:[0,array,length-i)
            //有序区间[array.length-i,array.length)

            //假设数组已经有序
            boolean isSorted=true;

            //冒泡过程
            //只在无序区间中进行
            //循环到无序区间的倒数第二个数,然后倒数第二会和倒数第一再比较
            for (int j  = 0; j  <array.length-i-1 ; j ++) {
                if(array[j]>array[j+1]){
                  swap(array, j, j+1);
                  //交换过,说明数组无序
                    isSorted=false;
                }
            }

            //如果数组有序,退出循环
            if(isSorted){
                break;
            }
        }
    }

    public static void swap(long []array,int i,int j){
     long t=array[i];
     array[i]=array[j];
     array[j]=t;
    }

性能分析:
 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值