【十八】常见排序算法

以下都是内部排序:

public class Sort {

    public static void main(String[] args) {

        int []a = {2,3,1,4,7,8,6,5,0};

        int []b = {1,2,3,4};

        //directChooseSort(a);

        //bubbleSort(a);

        //insertSort(a);

        quickSort(a, 0, a.length-1);

        for(int i=0;i<a.length;i++){

            System.out.print(a[i]+" ");

        }

        //bubbleSort(b);

        //for(int i=0;i<b.length;i++){

        //  System.out.print(b[i]+" ");

        //}

    }



            

     /**

     * 直接插入排序(属于插入排序),改进的方式是采用折半查找插入的位置

     */

    public static void insertSort(int a[]){//最坏情况下,进行n-1趟,第i趟排序需要比较i次O(n^2)  O(1)    稳定,从最大元素开始寻找插入位置,一般不会每个元素都比较

        for(int i=0;i<a.length-1;i++){

            if(a[i+1]<a[i]){//当无序表中的数据比有序表中的最大数据小时,才进行插入

                int temp = a[i+1];

                int j = i;

                for(;j>=0&&temp<a[j];j--){

                    a[j+1]=a[j];

                }

                a[j+1]=temp;

            }

        }

    }

    

    /**

     * 直接选择排序(属于选择排序)    堆排序  nlog2(n)    O(1)    不稳定

     * @param a

     */

    public static void directChooseSort(int  a[]){//进行n-1趟,第i趟排序需要比较n-i次   O(n^2)   O(1)  不稳定

        for(int i=0;i<a.length-1;i++){

            int k = i;//本趟中最小的元素下标

            for(int j=i+1;j<a.length;j++){

                if(a[j]<a[k]){

                    k=j;

                }

            }

            int temp = a[k];

            a[k] = a[i];

            a[i] = temp;

        }

    }

    

    /**

     * 冒泡排序(属于交换排序)

     */

    public static void bubbleSort(int a[]){//进行n-1趟,第i趟排序需要比较n-i次O(n^2)  O(1)    稳定,如果有序那么第一趟完成即可提前结束

        for(int i=0;i<a.length-1;i++){

            boolean flag = false;//通过flag判断是否可以提前结束排序

            for(int j=0;j<a.length-i-1;j++){

                if(a[j]>a[j+1]){

                    flag=true;

                    int temp = a[j];

                    a[j] = a[j+1];

                    a[j+1] = temp;

                }

            }

            if(!flag){

                System.out.println("排序提前结束");

                break;

            }

        }

    }

    //直接插入排序和冒泡排序比直接选择排序要快,因为直接选择排序无论如何每一个元素都需要进行过比较

    

    /**

     * 快速排序(属于交换排序)

     */

    public static void quickSort(int a[],int  start,int end){    //O(nlog2(n))    O(log2(n))  不稳定

        if(start>=end){

            return;

        }

        int i=start;

        int j=end;

        int temp=a[i];

        while(i<j){

            while(a[j]>=temp&&j>i) j--;

            a[i]=a[j];

            while(a[i]<=temp&&i<j) i++;

            a[j]=a[i];

        }

        a[i]=temp;

        quickSort(a, start, i-1);

        quickSort(a, i+1, end);

    }

    

}

堆排序:堆排序的要点就是调整堆和构造堆,其实构造堆也就是调整堆的过程

构造堆:将堆构造为一个大顶堆或者小顶堆,从最后一个非叶子节点(n/2,(n-1)/2)开始调整,比较该节点和该节点的左孩子与右孩子,选择出一个最大的,然后将该节点与其交换,交换之后如果被交换的孩子节点不满足大顶堆,那么对其进行调整

 

希尔排序:将整个待排元素分割成若干个子序列(相隔某个增量的元素组成)分别进行直接插入排序,待整个序列基本有序后,再对全体元素进行一次直接插入排序。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java常见排序算法有以下几种: 1. 冒泡排序(Bubble Sort):比较相邻的元素,如果顺序错误就交换位置,重复这个过程直到整个数组有序。 2. 选择排序(Selection Sort):在未排序序列中找到最小(大)元素,将其放到已排序序列的末尾,重复这个过程直到整个数组有序。 3. 插入排序(Insertion Sort):将未排序的元素插入已排序序列中的合适位置,重复这个过程直到整个数组有序。 4. 快速排序(Quick Sort):选择一个基准元素,将数组分成两部分,左边部分的元素都小于基准元素,右边部分的元素都大于基准元素,对两部分分别进行快速排序,重复这个过程直到整个数组有序。 5. 归并排序(Merge Sort):将数组分成两半,分别对每一半进行归并排序,然后将两个有序的子数组合并成一个有序的数组,重复这个过程直到整个数组有序。 6. 堆排序(Heap Sort):首先将数组构建成一个最大堆(或最小堆),然后将堆顶元素与最后一个元素交换位置并移出堆,再调整堆使其重新满足堆的性质,重复这个过程直到整个数组有序。 7. 希尔排序(Shell Sort):将数组按照一定间隔分组,对每一组进行插入排序,然后缩小间隔再次分组并进行插入排序,重复这个过程直到间隔为1,即最后一次对整个数组进行插入排序。 8. 计数排序(Counting Sort):统计数组中每个元素出现的次数,然后根据统计信息将元素放回原数组中,重复这个过程直到整个数组有序。 9. 桶排序(Bucket Sort):将数组划分为若干个桶,将元素放入对应的桶中,然后对每个桶中的元素进行排序,最后将所有非空桶按照顺序合并起来。 10. 基数排序(Radix Sort):将元素按照位数进行排序,先按个位数字进行排序,然后按十位数字进行排序,依次类推,直到最高位。 以上是Java常见排序算法,每种算法在不同的情况下有不同的适用性和性能表现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值