目錄
一、直接插入排序
1. 圖解插排
2. 程式碼實作
3.效能偵測與時空複雜度
二、希爾排序(交換法)
1. 思路圖解
3. 時間複雜度
4. 關於增量的選擇
三、希爾排序(移位法)
#1. 思路
3. 實驗結果
首頁 Java java教程 如何用Java對一億個隨機數字進行排序?

如何用Java對一億個隨機數字進行排序?

May 09, 2023 pm 05:31 PM
java

一、直接插入排序

1. 圖解插排

思路: 字面意義,插入是將某一元素依某種規則放入到特定集合中,因此我們需要將序列分割成為兩塊,一部分為有序集合, 另一部分為待排序集合

圖解:

如何用Java對一億個隨機數字進行排序?

為了方便理解,我們就按最最特殊的4321序列來舉例,

根據上述的思路,我們需要將序列劃分為兩部分, 為了編碼方便,我們將第一個元素假設為有序集合, 那麼我們的循環應當是從第2個元素開始的,也就是3

為避免後面操作把3覆蓋掉了, 我們選擇一個臨時變數來保存3.也就是上文的val=arr[1] ,

由於是對陣列繼進行運算, 我們同時也需要取得有序集合的最後一個元素的索引作為遊標

當遊標不越界 , 且待插入的值小於遊標指示位置時(上圖的4) , 我們將元素4後移, 遊標前移,繼續檢查集合中的其它元素是否也小於待插入的元素, 直到遊標越界

#上圖由於集合內只有一個4, 遊標前移越界了, 因此循環終止. 下一輪比較開始執行

2. 程式碼實作

public static void insertSort(int[]arr){
        for(int i = 1 ; i < arr.length; i++){
            int val = arr[i];
            int valIndex = i - 1; //游标
            while(valIndex >= 0 && val < arr[valIndex]){ //插入的值比游标指示的值小
                arr[valIndex + 1] = arr[valIndex];
                valIndex--; //游标前移
            }
            arr[valIndex+1] = val;
        }
    }
1234567891011
登入後複製

3.效能偵測與時空複雜度

實際運行80w個資料耗時1分4秒(非準確值,每台機器可能都不一樣)

如何用Java對一億個隨機數字進行排序?

直接插排在排序記錄較少, 關鍵字基本有序的情況下效率較高

時間複雜度:

關鍵字比較次數: KCN=(n^2)/2 總移動次數: RMN= (n^2)/2

因此時間複雜度約為O(N^2)

二、希爾排序(交換法)

1. 思路圖解

如何用Java對一億個隨機數字進行排序?

2. 程式碼實作

public static void shellSort(int[] arr){ //交换法
        int tmp = 0;
        for(int gap = arr.length / 2 ; gap > 0 ; gap /= 2){
            for(int i = gap ; i < arr.length ; i++){ //先遍历所有数组
                for(int j  = i - gap ; j >= 0 ; j -= gap){//开启插入排序
                    if(arr[ j ] > arr[ gap + j ]){ //可以根据升降序修改大于或小于
                        tmp = arr[gap + j];
                        arr[j+gap] = arr[j];
                        arr[j] = tmp;
                    }
                }
            }
            System.out.println(gap);
            System.out.println(Arrays.toString(arr));
        }
    }
12345678910111213141516
登入後複製

這裡最難理解的應該是第三個for迴圈, j = i - gap, 表示小組內的第一個元素,即j=0,

當小組內的第一個元素大於第二個元素時(由於是邏輯上的分類,第二個元素的索引應當是第一個元素的所有值增量gap) , 交換兩者,反之j-=gap,繼續比較或跳出迴圈,

如此往復將所有小組都遍歷完之後, 縮小增量(即gap/=2) , 然後繼續上述步驟, 直到增量gap為1時, 序列排序結束

3. 時間複雜度

希爾排序的時間複雜度取決於增量序列的函數 , 需要具體問題具體分析,並不是一個確定的值,這也是第四點需要討論的問題

4. 關於增量的選擇

上述我們在做排序的時候增量縮減選用的時gap/=2的模型, 這並不是最優的選擇, 關於增量的選取, 屬於數學界尚未解決的一個問題

但是可以確定的是, 透過大量的實驗證明,當n->無窮大時, 時間複雜度可以減少到:

如何用Java對一億個隨機數字進行排序?

在下一點, 移位法中 , 我們也做了幾個實驗, 可以肯定的時,對於一定規模內(如800w~1億) 的計算, 希爾排序的速度遠遠超過了堆排序, 至少在筆者的電腦上是這樣的

三、希爾排序(移位法)

#交換法的速度比移位法慢很多,因此更多的是使用地移位法,並且移位法相較於交換法, 更"像"插入排序

#1. 思路

思路其實就是上述兩種排序的結合, 將分組插入的優點結合在一起, 效率非常高

體現的就是分治的思路,將一個較大序列切割成若干較小序列

如何用Java對一億個隨機數字進行排序?

2. 程式碼實作

public static void shellSort02(int[] arr){ //移位法
        for(int gap = arr.length/2 ; gap > 0 ; gap /= 2){ //分组
            for(int i = gap ; i < arr.length ; i++){ //遍历
                int valIndex = i;
                int val = arr[valIndex];
                if(val < arr[valIndex-gap]){ //插入的值小于组内另一个值
                   while(valIndex - gap >=0 && val < arr[valIndex-gap]){ //开始插排
                       // 插入
                       arr[valIndex] = arr[valIndex-gap];
                       valIndex -= gap; //让valIndex = valIndex-gap (游标前移)
                   }
                }
                arr[valIndex] = val;
            }
        }
    }
12345678910111213141516
登入後複製

3. 實驗結果

如何用Java對一億個隨機數字進行排序?
如何用Java對一億個隨機數字進行排序?
如何用Java對一億個隨機數字進行排序?

以上是如何用Java對一億個隨機數字進行排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

Java 中的時間戳至今 Java 中的時間戳至今 Aug 30, 2024 pm 04:28 PM

Java 中的時間戳記到日期指南。這裡我們也結合範例討論了介紹以及如何在java中將時間戳記轉換為日期。

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP與Python:核心功能 PHP與Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

See all articles