必須知道的八大種排序算法【java實現】(二) 選擇排序,插入排序,希爾算法【詳解】


一、選擇排序

   1、基本思想:在要排序的一組數中,選出最小的一個數與第一個位置的數交換;然后在剩下的數當中再找最小的與第二個位置的數交換,如此循環到倒數第二個數和最后一個數比較為止。
  
   2、實例

 

  3、算法實現

   /**
     * 選擇排序算法
     * 在未排序序列中找到最小元素,存放到排序序列的起始位置  
     * 再從剩余未排序元素中繼續尋找最小元素,然后放到排序序列末尾。 
     * 以此類推,直到所有元素均排序完畢。 
     * @param numbers
     */
    public static void selectSort(int[] numbers)
    {
    int size = numbers.length; //數組長度
    int temp = 0 ; //中間變量
    
    for(int i = 0 ; i < size ; i++)
    {
        int k = i;   //待確定的位置
        //選擇出應該在第i個位置的數
        for(int j = size -1 ; j > i ; j--)
        {
        if(numbers[j] < numbers[k])
        {
            k = j;
        }
        }
        //交換兩個數
        temp = numbers[i];
        numbers[i] = numbers[k];
        numbers[k] = temp;
    }
    }

 

 

二、插入排序

  1、基本思想:每步將一個待排序的記錄,按其順序碼大小插入到前面已經排序的字序列的合適位置(從后向前找到合適位置后),直到全部插入排序完為止。

  2、實例

  

  3、算法實現

     /**  
     * 插入排序
     * 
     * 從第一個元素開始,該元素可以認為已經被排序
     * 取出下一個元素,在已經排序的元素序列中從后向前掃描 
     * 如果該元素(已排序)大於新元素,將該元素移到下一位置  
     * 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置  
     * 將新元素插入到該位置中  
     * 重復步驟2  
     * @param numbers  待排序數組
     */  
    public static void insertSort(int[] numbers)
    {
    int size = numbers.length;
    int temp = 0 ;
    int j =  0;
    
    for(int i = 0 ; i < size ; i++)
    {
        temp = numbers[i];
        //假如temp比前面的值小,則將前面的值后移
        for(j = i ; j > 0 && temp < numbers[j-1] ; j --)
        {
        numbers[j] = numbers[j-1];
        }
        numbers[j] = temp;
    }
    }

  

4、效率:

時間復雜度:O(n^2).

 

 

三、希爾算法

1、基本思想:

先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序,待整個序列中的記錄“基本有序”時,再對全體記錄進行依次直接插入排序。

2、操作方法:

  1. 選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  2. 按增量序列個數k,對序列進行k 趟排序;
  3. 每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子序列,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。

希爾排序的示例:

 3、算法實現:

/**希爾排序的原理:根據需求,如果你想要結果從大到小排列,它會首先將數組進行分組,然后將較大值移到前面,較小值
 * 移到后面,最后將整個數組進行插入排序,這樣比起一開始就用插入排序減少了數據交換和移動的次數,可以說希爾排序是加強
 * 版的插入排序
 * 拿數組5, 2, 8, 9, 1, 3,4來說,數組長度為7,當increment為3時,數組分為兩個序列
 * 5,2,8和9,1,3,4,第一次排序,9和5比較,1和2比較,3和8比較,4和比其下標值小increment的數組值相比較
 * 此例子是按照從大到小排列,所以大的會排在前面,第一次排序后數組為9, 2, 8, 5, 1, 3,4
 * 第一次后increment的值變為3/2=1,此時對數組進行插入排序,
 *實現數組從大到小排
 */

    public static void shellSort(int[] data) 
    {
        int j = 0;
        int temp = 0;
        //每次將步長縮短為原來的一半
        for (int increment = data.length / 2; increment > 0; increment /= 2)
        {
        for (int i = increment; i < data.length; i++) 
        {
            temp = data[i];
            for (j = i; j >= increment; j -= increment) 
            {
            if(temp > data[j - increment])//如想從小到大排只需修改這里
            {   
                data[j] = data[j - increment];
            }
            else
            {
                break;
            }
            
            } 
            data[j] = temp;
        }
    
        }
    }

 

 4、效率

 時間復雜度:O(n^2). 

 

 

4、各種算法的時間復雜度

  

 

冒泡排序、快速排序可查看:http://www.cnblogs.com/0201zcr/p/4763806.html

歸並排序、堆排序可查看:http://www.cnblogs.com/0201zcr/p/4764705.html

   致謝:感謝您的耐心閱讀!


免責聲明!

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



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