Java常見排序算法之直接插入排序


   在學習算法的過程中,我們難免會接觸很多和排序相關的算法。總而言之,對於任何編程人員來說,基本的排序算法是必須要掌握的。

從今天開始,我們將要進行基本的排序算法的講解。Are you ready?Let‘s go~~~

1、排序算法的基本概念的講解

     時間復雜度:需要排序的的關鍵字的比較次數和相應的移動的次數。

     空間復雜度:分析需要多少輔助的內存。

     穩定性:如果記錄兩個關鍵字的A和B它們的值相等,經過排序后它們相對的位置沒有發生交換,那么我們稱這個排序算法是穩定的。

              否則我們稱這個排序算法是不穩定的。

   

    排序算法的常見分類:

    1、內部排序(最常見的一種排序方式,不需要借助第三方輔助存儲工具)

    2、外部排序(需要借助外部存儲來輔助完成相關的排序操作)

        如果參與排序的數據元素非常的多,數據量非常的大,計算機無法把整個排序過程放到內存中進行的話,

        我們必須借助外部存儲器如磁盤來完成,這種排序方式,我們稱之為外部排序。

        其中外部排序最常見的就是多路歸並排序,即將原始文件分解成多個能夠一次性裝入內存的部分,分別把每一部分調入

        內存完成相應的排序,接下來在對多個有序的外部文件進行多路歸並排序。

  

   對於我們絕大多數的程序員而言,我們經常遇到的為內部排序。接下來我們將要對常見的內部排序進行相應的講解。

    今天要講解的內部排序為:

   直接插入排序

  1.直接插入排序的基本概念的講解  

  直接插入排序(straight insertion sort)的做法是:
每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。
第一趟比較前兩個數,然后把第二個數按大小插入到有序表中; 第二趟把第三個數據與前兩個數從前向后掃描,把第三個數按大小插入到有序表中;
依次進行下去,進行了(n-1)趟掃描以后就完成了整個排序過程。
 
直接插入排序是由兩層嵌套循環組成的。外層循環標識並決定待比較的數值。內層循環為待比較數值確定其最終位置。直接插入排序是將待比較的數
值與它的前一個數值進行比較,所以外層循環是從第二個數值開始的。當前一數值比待比較數值大的情況下繼續循環比較,直到找到比待比較數值小
的並將待比較數值置入其后一位置,結束該次循環。
 
值得注意的是,我們必需用一個存儲空間來保存當前待比較的數值,因為當一趟比較完成時,我們要將待比較數值置入比它小的數值的后一位 插入排
序類似玩牌時整理手中紙牌的過程。插入排序的基本方法是:每步將一個待排序的記錄按其關鍵字的大小插到前面已經排序的序列中的適當位置,直到
全部記錄插入完畢為止。

排序方法
1.簡單方法
首先在當前有序區R[1..i-1]中查找R[i]的正確插入位置k(1≤k≤i-1);然后將R[k..i-1]中的記錄均后移一個位置,騰出k位置上的空間插入R[i]。
注意:若R[i]的關鍵字大於等於R[1..i-1]中所有記錄的關鍵字,則R[i]就是插入原位置。
2.改進的方法
一種查找比較操作和記錄移動操作交替地進行的方法。具體做法:
將待插入記錄R[i]的關鍵字從右向左依次與有序區中記錄R[j](j=i-1,i-2,…,1)的關鍵字進行比較:
① 若R[j]的關鍵字大於R[i]的關鍵字,則將R[j]后移一個位置;
②若R[j]的關鍵字小於或等於R[i]的關鍵字,則查找過程結束,j+1即為R[i]的插入位置。
關鍵字比R[i]的關鍵字大的記錄均已后移,所以j+1的位置已經騰空,只要將R[i]直接插入此位置即可完成一趟直接插入排序。

 

  2.直接插入排序的Java代碼實現

   

package com.yonyou.test;

/**
 * 內部排序算法之直接插入排序
 * 默認按照從小到大進行排序操作
 * @author 小浩
 * @創建日期 2015-3-27
 */
public class Test{
	public static void main(String[] args) {
   //需要進行排序的數組
	int[] array=new int[]{8,3,2,1,7,4,6,5};
	 //輸出原數組的內容
    printResult(array);
	//直接插入排序操作
	directInsertSort(array);
	//輸出排序后的相關結果
	printResult(array);
	}
	
	
   
	/**
	 * 直接插入排序的方法
	 * @param array
	 */
	private static void directInsertSort(int[] array) {
       for(int i=0;i<array.length;i++)
       {
    	    for(int j=0;j<i;j++)
    	    {
    	    	if(array[i]<array[j])
    	    	{
    	    	  int temp=array[i];
    	    	  System.arraycopy(array,j,array,j+1,i-j);
    	    	  array[j]=temp;
    	    	}
    	    }
       }
	}
	


	

	/**
     *                                        
	 * 輸出相應數組的結果
	 * @param array
	 */
	private static void printResult(int[] array) {
       for(int value:array)		
    	   System.out.print(" "+value+" ");
      System.out.println();
	}

	/**
	 * 交換數組中兩個變量的值
	 * @param array
	 * @param i
	 * @param j
	 */
	private static void swap(int[] array,int i,int j){
		int temp=array[i];
		array[i]=array[j];
		array[j]=temp;
	}
}

 

  

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM