Java常見排序算法之直接選擇排序


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

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

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

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

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

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

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

   

    排序算法的常見分類:

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

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

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

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

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

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

  

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

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

   直接選擇排序

   1.基本概念

     所謂直接選擇排序:就是第一次從R[0]~R[n-1]中選取最小值,與R[0]交換,第二次從R[1]~R[n-1]中選取最小值,與R[1]交換,....,第i次從R[i-1]~R[n-1]中選取最小值,與R[i-1]交換,.....,第n-1次從R[n-2]~R[n-1]中選取最小值,與R[n-2]交換,總共通過n-1次,得到一個按排序碼從小到大排列的有序序列·

     例如:

初始狀態 [ 8 3 2 1 7 4 6 5 ]   8 -- 1
第一次 [ 1 3 2 8 7 4 6 5 ]      3 -- 2
第二次  [ 1 2 3 8 7 4 6 5 ]     3 -- 3
第三次  [ 1 2 3 8 7 4 6 5 ]     8 -- 4
第四次  [ 1 2 3 4 7 8 6 5 ]     7 -- 5
第五次  [ 1 2 3 4 5 8 6 7 ]     8 -- 6
第六次  [ 1 2 3 4 5 6 8 7 ]     8 -- 7
第七次  [ 1 2 3 4 5 6 7 8 ]   
排序完成

 

2.Java代碼實

使用Java代碼實現相關的內容

 

package com.yonyou.test;

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

 

 上面的直接選擇排序的存在一定的效率問題,不知道你是否發現了。對於每次選擇的時候,一旦發現當前數比被比較的數小,立刻交換它們的

 值,其實沒有必要這樣做的。因為我們可以先暫存一下結果,當所有的循環都執行完畢的時候,我們在進行交換處理也不遲。而且這樣可以有

 效的提高效率。具體的請看代碼:

 

package com.yonyou.test;

/**
 * 內部排序算法之直接選擇排序
 * 默認按照從小到大進行排序操作
 * @author 小浩
 * @創建日期 2015-3-24
 */
public class Test{
	public static void main(String[] args) {
   //需要進行排序的數組
	int[] array=new int[]{8,3,2,1,7,4,6,5};
	 //輸出原數組的內容
    printResult(array);
	//進行直接選擇排序操作
	for(int i=0;i<array.length-1;i++)
	{
		//用於暫存當前變量的最小的值
		int temp=i;
		for(int j=i+1;j<array.length;j++)
		{
			if(array[temp]>array[j])
				temp=j;
		}
		if(temp!=i)
		swap(array,i,temp);				
	}
	
	//輸出排序后的相關結果
	printResult(array);
	}
	
	/**
	 * 輸出相應數組的結果
	 * @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;
	}
}

 

 3.直接選擇排序的效率分析

    時間復雜度:假設有n個數據,數據交換的次數最多為n-1次,但程序的總體的比較次數較多。所以綜合考慮有直接選擇排序的時間復雜度為O(n2)

   (n的平方)。所以當記錄占用字節數較多時,通常比直接插入排序的執行速度快些。

    空間復雜度:直接選擇排序的空間復雜度很好,它只需要一個附加單元用於數據交換,所以其空間復雜度為O(1)。

    穩定性:由於在直接選擇排序中存在着不相鄰元素之間的互換,因此,直接選擇排序是一種不穩定的排序方法。

 

   好吧,直接選擇排序的講解就先到這里了。

 

 

 

 

 

      

  

 

 

 

   

 


免責聲明!

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



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