標籤:
在學習演算法的過程中,我們難免會接觸很多和排序相關的演算法。總而言之,對於任何編程人員來說,基本的排序演算法是必須要掌握的。
從今天開始,我們將要進行基本的排序演算法的講解。Are you ready?Let‘s go~~~
1、排序演算法的基本概念的講解
時間複雜度:需要排序的的關鍵字的比較次數和相應的移動的次數。
空間複雜度:分析需要多少輔助的記憶體。
穩定性:如果記錄兩個關鍵字的A和B它們的值相等,經過排序後它們相對的位置沒有發生交換,那麼我們稱這個排序演算法是穩定的。
否則我們稱這個排序演算法是不穩定的。
排序演算法的常見分類:
1、內部排序(最常見的一種排序方式,不需要藉助第三方輔助儲存工具)
2、外部排序(需要藉助外部儲存來輔助完成相關的排序操作)
如果參與排序的資料元素非常的多,資料量非常的大,電腦無法把整個排序過程放到記憶體中進行的話,
我們必須藉助外部儲存空間如磁碟來完成,這種排序方式,我們稱之為外部排序。
其中外部排序最常見的就是多路歸併排序,即將原始檔案分解成多個能夠一次性裝入記憶體的部分,分別把每一部分調入
記憶體完成相應的排序,接下來在對多個有序的外部檔案進行多路歸併排序。
對於我們絕大多數的程式員而言,我們經常遇到的為內部排序。接下來我們將要對常見的內部排序進行相應的講解。
今天要講解的內部排序為:
Shell排序
1.Shell排序的基本概念的講解
2.Shell排序的Java代碼實現
package com.yonyou.test;/** * 內部排序演算法之Shell排序 * 預設按照從小到大進行排序操作 * @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);//shell排序操作shellSort(array);//輸出排序後的相關結果printResult(array);}/** * shell排序演算法 * 增量h=(h*3)+1; 這個增量公式是由Knuth給出的 * 如果不是很瞭解的話請百度一下吧 * @param array */private static void shellSort(int[] array) { //首先根據數組的長度確定增量的最大值 int h=1; // 按h * 3 + 1得到增量序列的最大值 while(h <= array.length / 3){h = h * 3 + 1;} //進行增量尋找和排序 while(h>0) { for(int i=h;i<array.length;i++) { for(int k=i;k<array.length;k+=h) { //判斷是否需要重新排序,如果小於k-h處的值,需要重新排序 if(array[k]<array[k-h]) { int tempValue=array[k]; int j=k; for(;j>=i&&tempValue<array[j-h];j-=h) { array[j]=array[j-h]; } array[j]=tempValue; } } printResult(array); } h=(h-1)/3; } }/** * * 輸出相應數組的結果 * @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;}}
Java常見排序演算法之Shell排序