最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Arrays.sort()如何實(shí)現(xiàn)對(duì)int類型數(shù)組倒序排序

 更新時(shí)間:2023年08月21日 09:59:02   作者:mp-ui  
這篇文章主要介紹了Java Arrays.sort()如何實(shí)現(xiàn)對(duì)int類型數(shù)組倒序排序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Java Arrays.sort()實(shí)現(xiàn)對(duì)int類型數(shù)組倒序排序

Java的Arrays.sort()僅支持對(duì)引用數(shù)據(jù)類型進(jìn)行自定義排序,如果是基本數(shù)據(jù)類型(如int類型),將無法使用Comparator進(jìn)行自定義排序。

可以使用下面的方法來實(shí)現(xiàn)

  • 1.手動(dòng)實(shí)現(xiàn)排序算法。
  • 2.先排序再reverse
int[] nums = new int[]{1,6,4,55,61,3,5,8,4,2,8,15,61,33};
	Arrays.sort(nums);
	for (int i = 0; i < nums.length/2; i++) {
	    int temp = nums[i];
	    nums[i] = nums[nums.length - 1 - i];
	    nums[nums.length - 1 - i] = temp;
	}
	System.out.println(Arrays.toString(nums));
  • 3.轉(zhuǎn)換成Integer[]
    int[] nums = new int[]{1,6,4,55,61,3,5,8,4,2,8,15,61,33};
    Integer[] temp = new Integer[nums.length];
    for (int i = 0; i < temp.length; i++) {
        temp[i] = nums[i];
    }
    Arrays.sort(temp,(i,j)->(j-i));
    for (int i = 0; i < nums.length; i++) {
        nums[i] = temp[i];
    }
    System.out.println(Arrays.toString(nums));

Arrays.sort()用的是什么排序算法?怎么優(yōu)化?

Arrays.sort()用的是快速排序算法。相信大家對(duì)于這個(gè)都是了解的。

算法的思想

選擇基準(zhǔn)將數(shù)組一分為二,基準(zhǔn)前面的比基準(zhǔn)小,基準(zhǔn)后面的比基準(zhǔn)大,之后分別對(duì)這兩部分繼續(xù)之前的操作,已達(dá)到整個(gè)數(shù)組有序的目的。

算法內(nèi)容描述

  • 先選擇一個(gè)基準(zhǔn),指向數(shù)組開始的指針start和指向數(shù)組結(jié)束的指針end;
  • 當(dāng)start小于end的時(shí)候,如果基準(zhǔn)的值小于end指向數(shù)組的值時(shí),end往前移動(dòng);
  • 當(dāng)基準(zhǔn)的值不在小于end指向數(shù)組的值的時(shí)候,交換兩個(gè)指針指向的數(shù)組的值;
  • 然后當(dāng)基準(zhǔn)的值大于start指向數(shù)組的值的時(shí)候,start往后移動(dòng);
  • 當(dāng)基準(zhǔn)的值不大于start指向數(shù)組的值的時(shí)候,交換兩個(gè)指針指向的數(shù)組的值;
  • 返回基準(zhǔn)的位置并進(jìn)行遞歸操作完成排序。

代碼如下:

public class Test2 {
    public static void swap(int[] arr, int j, int i){
        int temp = arr[j];
        arr[j] = arr[i];
        arr[i] = temp;
    }
    public static int partition(int arr[], int start, int end){
        assert(null != arr);
        int temp = arr[start];
        while(start < end){
            while(temp < arr[end] && start < end){
                end--;
            }
            swap(arr, start, end);
            while(temp > arr[start] && start < end){
                start++;
            }
            swap(arr, start, end);
        }
        System.out.println(Arrays.toString(arr) + "   " +  start);
        return start;
    }
    public static void partitionSort(int arr[], int start, int end){
        assert(null != arr);
        if(start < end){
            int midd = partition(arr, start, end);
            partitionSort(arr, start, midd - 1);
            partitionSort(arr, midd + 1, end);
        }
    }
    public static void main(String[] args) {
        int arr[] = {9,1,5,8,3,7,4,6,2};  
        Test2.partitionSort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }
}

執(zhí)行結(jié)果:

[2, 1, 5, 8, 3, 7, 4, 6, 9] 8
[1, 2, 5, 8, 3, 7, 4, 6, 9] 1
[1, 2, 4, 3, 5, 7, 8, 6, 9] 4
[1, 2, 3, 4, 5, 7, 8, 6, 9] 3
[1, 2, 3, 4, 5, 6, 7, 8, 9] 6
[1, 2, 3, 4, 5, 6, 7, 8, 9]

快速排序的優(yōu)化

①優(yōu)化基準(zhǔn)的選擇

上面的程序選擇的基準(zhǔn)是數(shù)組起始位置,但是跟明顯,我們并沒有達(dá)到想要的理想結(jié)果將數(shù)組劃分為兩部分,進(jìn)行遞歸操作;

所以就有了三數(shù)取中法來選取基準(zhǔn),即取三個(gè)關(guān)鍵字先進(jìn)行排序,將中間數(shù)作為基準(zhǔn),一般去開始,結(jié)束,和中間;

當(dāng)然也可以隨機(jī)選??;其實(shí)還有一種九數(shù)取中法,這里就不詳細(xì)介紹了,有興趣的可以自己了解一下。

下面是三數(shù)取中法的代碼:

public void medianOfThree(int[] arr, int start, int end){
        int m = start + (end - start) / 2;
        if(arr[start] > arr[end]){
            swap(arr, start, end);
        }
        if(arr[m] > arr[end]){
            swap(arr, end, m);
        }
        if(arr[m] > arr[start]){
            swap(arr, m, start);
        }
    }

②優(yōu)化不必要的交換

首先我們通過上面的代碼很容易發(fā)現(xiàn)在交換的過程中,有許多部分是沒必要交換的,于是我們通過賦值替代交換來省去沒必要的交換;

代碼如下:

public int partition3(int arr[], int start, int end){
        assert(null != arr);
        medianOfThree(arr, start, end);
        int temp = arr[start];
        while(start < end){
            while(temp < arr[end] && start < end){
                end--;
            }
            arr[start] = arr[end];
            while(temp > arr[start] && start < end){
                start++;
            }
            arr[end] = arr[start];
        }
        arr[start] = temp;
        System.out.println(Arrays.toString(arr) + "   " +  start);
        return start;
    }

③優(yōu)化小數(shù)組時(shí)的排序方案

一般對(duì)于小數(shù)組排序,我們需要選擇插入排序,因?yàn)椴迦肱判蚴呛?jiǎn)單排序性能最高的。所以我們做如下修改:

public void partitionSort4(int arr[], int start, int end){
        assert(null != arr);
        if((end - start) > INSERT_SORT){
            int midd = partition3(arr, start, end);
            partitionSort3(arr, start, midd - 1);
            partitionSort3(arr, midd + 1, end);
        }else{
            insertSort(arr);
        }
    }

其中,INSERT_SORT選擇的大小眾說紛紜,自我覺得在海量數(shù)據(jù)面前,選擇20跟選擇7沒有太大的差異吧。(這話如果有誤,望大家批評(píng)指正)

④優(yōu)化遞歸操作

我們都知道遞歸的額外花銷還是很大的,減少遞歸可以大大提高性能,故此做如下修改:

 public void partitionSort5(int arr[], int start, int end){
        assert(null != arr);
        int midd;
        if((end - start) > INSERT_SORT){
            while(start < end){
                midd = partition3(arr, start, end);
                partitionSort5(arr, start, midd - 1);
                start = midd + 1;
            }
        }else{
            insertSort(arr);
        }
    }

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java創(chuàng)建excel示例(jxl使用方法)

    java創(chuàng)建excel示例(jxl使用方法)

    Java Excel是一開放源碼項(xiàng)目,通過它Java開發(fā)人員可以讀取Excel文件的內(nèi)容、創(chuàng)建新的Excel文件、更新 已經(jīng)存在的Excel文件。下面是使用方法,包括去掉網(wǎng)格線、字體設(shè)置、單元格設(shè)置、對(duì)齊方式等設(shè)置
    2014-03-03
  • SpringBoot中Date格式化處理的三種實(shí)現(xiàn)

    SpringBoot中Date格式化處理的三種實(shí)現(xiàn)

    Spring Boot作為一個(gè)簡(jiǎn)化Spring應(yīng)用開發(fā)的框架,提供了多種處理日期格式化的方法,本文主要介紹了SpringBoot中Date格式化處理實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Java中new關(guān)鍵字和newInstance方法的區(qū)別分享

    Java中new關(guān)鍵字和newInstance方法的區(qū)別分享

    在初始化一個(gè)類,生成一個(gè)實(shí)例的時(shí)候,newInstance()方法和new關(guān)鍵字除了一個(gè)是方法一個(gè)是關(guān)鍵字外,最主要的區(qū)別是創(chuàng)建對(duì)象的方式不同
    2013-07-07
  • mybatisPlus?FieldStrategy?策略作用小結(jié)

    mybatisPlus?FieldStrategy?策略作用小結(jié)

    MyBatis-Plus的FieldStrategy枚舉用于控制實(shí)體字段在插入、更新和查詢條件中的空值處理策略,下面就來詳細(xì)的介紹一下mybatisPlus?FieldStrategy?策略,感興趣的可以了解一下
    2025-12-12
  • Java 響應(yīng)式編程與 Spring WebFlux深入探討

    Java 響應(yīng)式編程與 Spring WebFlux深入探討

    響應(yīng)式編程是一種基于異步數(shù)據(jù)流(Asynchronous Data Streams)和變化傳播(Propagation of Change)的編程范式,本文給大家介紹Java響應(yīng)式編程與Spring WebFlux的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2025-09-09
  • Java Mybatis數(shù)據(jù)源之工廠模式

    Java Mybatis數(shù)據(jù)源之工廠模式

    這篇文章主要介紹了Java Mybatis數(shù)據(jù)源之工廠模式,工廠模式是比較簡(jiǎn)單的設(shè)計(jì)模式,Mybatis的數(shù)據(jù)源的部分使用了工廠模式,文章詳細(xì)介紹內(nèi)容需要的朋友可以參考一下
    2022-06-06
  • Ribbon的饑餓加載(eager-load)模式解讀

    Ribbon的饑餓加載(eager-load)模式解讀

    這篇文章主要介紹了Ribbon的饑餓加載(eager-load)模式解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • java+selenium爬取圖片簽名的方法

    java+selenium爬取圖片簽名的方法

    這篇文章主要為大家詳細(xì)介紹了java+selenium爬取圖片簽名的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java結(jié)構(gòu)型設(shè)計(jì)模式中建造者模式示例詳解

    Java結(jié)構(gòu)型設(shè)計(jì)模式中建造者模式示例詳解

    建造者模式,是一種對(duì)象構(gòu)建模式 它可以將復(fù)雜對(duì)象的建造過程抽象出來,使這個(gè)抽象過程的不同實(shí)現(xiàn)方法可以構(gòu)造出不同表現(xiàn)的對(duì)象。本文將通過示例講解建造者模式,需要的可以參考一下
    2022-09-09
  • RabbitMQ實(shí)現(xiàn)延遲通知的兩種方案

    RabbitMQ實(shí)現(xiàn)延遲通知的兩種方案

    延遲通知是指消息在發(fā)送后不會(huì)立即被消費(fèi),而是在指定的時(shí)間延遲后才被處理的消息傳遞機(jī)制,
    2025-10-10

最新評(píng)論

阿图什市| 土默特左旗| 清河县| 新绛县| 怀柔区| 大埔县| 金寨县| 贵港市| 吉安市| 安塞县| 霍山县| 随州市| 松江区| 建宁县| 淅川县| 隆化县| 阜城县| 白城市| 宿州市| 唐海县| 高邑县| 财经| 吴忠市| 越西县| 腾冲县| 宣武区| 工布江达县| 江都市| 大同县| 浏阳市| 城口县| 偏关县| 大埔县| 任丘市| 贵阳市| 舞阳县| 偏关县| 内江市| 长春市| 那坡县| 宜兰市|