ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

排序API问题

2021-07-28 21:02:39  阅读:124  来源: 互联网

标签:sort right int 问题 ++ API 排序 left


排序API


1. Arrays类中的静态排序API

  • **Arrays.sort(数据类型[] a)中的排序是用的是快速排序,时间复杂度是O(nlogn)

对指定的 类型数组按数字升序进行排序。不稳定

  • Arrays.sort(T[],Comparator<? super T> c) 、Arrays.sort(Object[] a)

根据指定比较器产生的顺序对指定对象数组进行排序,当c=null时按自然序排列

该排序算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。此算法提供可保证的 n*log(n) 性能。 稳定

2. Collections静态排序API

Collections.sort(List list)、和Collections.sort(List list,Comparator<?super T> c);

使用的排序是稳定的,主要是对list排序

该排序算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素小于高子列表中的最低元素,则忽略合并)。此算法提供可保证的 n log(n) 性能。
此实现将指定列表转储到一个数组中,并对数组进行排序,在重置数组中相应位置处每个元素的列表上进行迭代。这避免了由于试图原地对链接列表进行排序而产生的
n2 log(n) 性能。

3. ArrayList的排序API

list.sort(Comparator<? super T> c);对list排序,当c=null时,按自然序排列


1,对list排序,可以使用list自己的sort方法,也可以使用Collections的静态排序方法,且Collections的排序方法都是稳定的

2,Arrays的静态sort,一个是快排,一个归并排序(稳定的)

补充:常见的排序方法

分类

  1. 插入排序:直接插入排序、二分法插入排序、希尔排序。
  2. 选择排序:简单选择排序、堆排序。
  3. 交换排序:冒泡排序、快速排序。
  4. 归并排序
  5. 基数排序

在这里插入图片描述

快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出

算法思想

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

在这里插入图片描述

①以第一个关键字 K 1 为控制字,将 [K 1 ,K 2 ,…,K n ] 分成两个子区,使左区所有关键字小于等于 K 1 ,右区所有关键字大于等于 K 1 ,最后控制字居两个子区中间的适当位置。在子区内数据尚处于无序状态。
②把左区作为一个整体,用①的步骤进行处理,右区进行相同的处理。(即递归)
③重复第①、②步,直到左区处理完毕。

static void quicksort(int n[],int left,int right) {
        int dp;
        if (left < right) {
            dp = partition(n, left, right);
            quicksort(n, left, dp -1);
            quicksort(n, dp +1, right);
        }
    }
 
    static int partition(int n[],int left,int right) {
        int pivot = n[left];
        while (left < right) {
            while (left < right && n[right] >= pivot)
                right--;
            if (left < right)
                n[left++] = n[right];
            while (left < right && n[left] <= pivot)
                left++;
            if (left < right)
                n[right--] = n[left];
        }
        n[left] = pivot;
        return left;
    }

归并排序

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

在这里插入图片描述

public static int[] sort(int[] a,int low,int high){
        int mid = (low+high)/2;
        if(low<high){
            sort(a,low,mid);
            sort(a,mid+1,high);
            //左右归并
            merge(a,low,mid,high);
        }
        return a;
    }
     
    public static void merge(int[] a,int low,int mid,int high) {
        int[] temp =new int[high-low+1];
        int i= low;
        int j = mid+1;
        int k=0;
        // 把较小的数先移到新数组中
        while(i<=mid && j<=high){
            if(a[i]<a[j]){
                temp[k++] = a[i++];
            }else{
                temp[k++] = a[j++];
            }
        }
        // 把左边剩余的数移入数组 
        while(i<=mid){
            temp[k++] = a[i++];
        }
        // 把右边边剩余的数移入数组
        while(j<=high){
            temp[k++] = a[j++];
        }
        // 把新数组中的数覆盖nums数组
        for(int x=0;x<temp.length;x++){
            a[x+low] = temp[x];
        }
    }

标签:sort,right,int,问题,++,API,排序,left
来源: https://blog.csdn.net/qq_43085596/article/details/119189651

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有