插入排序的三种算法(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代码实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛牛之瀛洲公园(09.10)
- 下一篇: 服务器cpu一直处于100%解决思路