日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

插入排序的三种算法(Java代码实现)

發布時間:2023/12/20 java 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 插入排序的三种算法(Java代码实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

插入排序: ???

??????? 基本思想:

1:直接插入排序:

??????? 基本思想:

??????? 過程:

2:折半插入排序:

??????? 基本思想:

??????? 過程:

3:希爾排序:

??????? 基本思想:

??????? 過程:


?

插入排序: ??

基本思想:

????????每一趟將一個待排序的數,按照它的大小插入到已經排好序的一組數組的適當位置上,直到所有數排序完成。例如你斗地主會理牌吧,過程相同,原理一樣。

????????根據查找方法的不同,大致分為了三種:1:直接插入排序.2:折半插入排序.3:希爾排序.

1:直接插入排序:

基本思想:

????????顧名思義,就是直接把一個數插入到已經排好的有序表中,查找插入位置方法為順序查找,從而得到一個新的有序表,直到所有數字排序完成。

過程:

?????? 先來看一張圖:

?????? 在實現插入時我們可以選擇從小到大比較,也可以選擇從大到小比較,圖例所示就是從大到小比較的順序。

代碼實現:

import java.util.Arrays;public class InsertSort {public static void main(String[] args){int[] a={12,15,9,20,6,31,24};Sort(a);//調用方法}public static void Sort(int[] s){for (int i=1;i< s.length;i++){//注意i不能等于數組長度,因為數組下標從零開始而不是從1.int temp=s[i];//存儲待插入數的數值int j;//j必須在此聲明,如果在for循環內聲明,j就不能拿出for循環使用,最后一步插入就無法執行for (j=i-1;j>=0&&temp<s[j];j--){s[j+1]=s[j];//如果大于temp,往前移動一個位置}s[j+1]=temp;//將temp插入到適當位置}System.out.println(Arrays.toString(s));//輸出排好序的數組} }

結果:

?時間復雜度:

?空間復雜度:

?算法特點:

???? (1):穩定排序。

???? (2):算法簡便,且容易實現。

???? (3):更適合于初始記錄基本有序(正序)的情況,初始記錄無序,n較大,時間復雜度高,不宜采用。

2:折半插入排序:

基本思想:

????????在直接插入排序的基礎上,將查找方法從順序查找改為折半查找,就是在將 將要插入到現有 有序序列的數字尋找適當插入位置的比較次數減少了。

過程:

代碼實現:

import java.util.Arrays;public class BinsertSort {public static void main(String[] args){int[] a={2,6,3,8,1,4,2,7};BInsertSort(a);//調用方法}private static void BInsertSort(int[] s){for(int i=1;i<s.length;i++){int temp=s[i];//保存要插入的數的數值int low=0;//設置查找區間初始值 下區間值int high=i-1;//上區間值while(low<=high){//查找結束條件int mid=(high+low)/2;//折半,中間值if(s[mid]>temp){//待插入值小于中間值high=mid-1;//上區間值變為中間值-1}else {//待插入值大于中間值low=mid+1;//下區間值變為中間值+1}}for (int j=i-1;j>=low;j--){s[j+1]=s[j];//將low及low之前的數向前移動一位}s[low]=temp;//low就是待插入值的適當插入點}System.out.println(Arrays.toString(s));//輸出排好序的數組} }

? 結果:

? 時間復雜度:

? 空間復雜度:

? 算法特點:

?????? (1):穩定排序。

?????? (2):適合初始記錄無序,n較大的情況。

3:希爾排序:

基本思想:

?????? 又稱“縮小增量排序”(Diminishing Increment Sort),因D.LShell于1959年提出而得名。實質上是采用分組插入的方法,先將整個待排序數組分割成幾組,在對每組采用直接插入排序,然后再增加每組的數據量,重新分組,再直接插入排序,直到增量為1,再對整體進行一次直接插入排序。

過程:

?????? 先來看一張書上的圖:

?????????? 增量分別為:5,3,1。

?代碼實現:

import java.util.Arrays;public class ShellSort {public static void main(String[] args) {int[] a={2,6,3,8,1,4,2,7};Shellsort(a);//調用方法}public static void Shellsort(int[] s){int zl=s.length/2;//設置增量為數組長度的1/2for (;zl>0;zl=zl/2){//增量依次減少為1/2for (int i=zl;i<s.length;i++){//對相應增量的數組分組進行直接插入排序int temp=s[i];int j;for (j=i-zl;j>=0&&temp<s[j];j-=zl){//注意這里必須將j的初值設置為i-zl,否則數組下標會出界(也就是為負數)s[j+zl]=s[j];}s[j+zl]=temp;}}System.out.println(Arrays.toString(s));//輸出排好序的數組} }

? 結果:

??? 時間復雜度:(最好情況) (最壞情況)

??? 空間復雜度:

??? 算法特點:

???????? (1):不穩定排序(數據跳躍式移動)。

???????? (2):增量有各種取法,最后一個增量值必須為1。

???????? (3):適合初始記錄無序,n較大的情況。

?

總結

以上是生活随笔為你收集整理的插入排序的三种算法(Java代码实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。