標籤:直接插入排序
演算法思想(從小到大排序)
- 將待排序數組看左右兩個序列,左序列有序,有序列無序。
- 假設第一個數array[0]為有序列,那麼array[1,N-1]為無序列.迴圈遍曆無序列,找出array[i]在有序列中應該插入的位置,插入。
- 例如一個亂序數組為{1,3,2,4 , 假如有序列為 { 1,3 } 無序列迴圈到2時 ,那麼2在有序列中的位置應該是1 - 3 中間 , 所以 [ 3. . .2 ) 之間的所有資料右移 , 即3右移的2的位置 , 騰出了3原先所在的位置 , 由2替代
部落格地址:http://blog.csdn.net/mkrcpp/article/details/39320797
import java.util.Arrays;/*** * @title 直接插入排序 * @author michael.mao * @date 2014年9月16日 下午1:59:04 * @version V1.0 */public class InsertSort{/*** * @title 直接插入排序 * @description 將待排序數組看左右兩個序列,左序列有序,有序列無序。 * 假設第一個數array[0]為有序列,那麼array[1,N-1]為無序列.迴圈遍曆無序列,找出array[i] * 在有序列中應該插入的位置,插入。<br/> * 例如一個亂序數組為{1,3,2,4 , 假如有序列為 { 1,3 } 無序列迴圈到2時 , * 那麼2在有序列中的位置應該是1 - 3 中間 , 所以 [ 3. . .2 ) 之間的所有資料右移 , 即3 * 右移的2的位置 , 騰出了3原先所在的位置 , 由2替代 * @author michael.mao * @date 2014年9月16日 下午2:08:40 * @version V1.0 */public static void execute(int[] array){// 待插入的位置int tmpV, j = 0;// 迴圈無序列,次數為 N-1,預設有序列為 {array[0]}for (int i = 1; i < array.length; i++){// 儲存待插入的值tmpV = array[i];// 在有序列中找到合適的位置for (j = 0; j < i; j++)if ( array[i] < array[j] )break;// 如果array[i]比有序列中任何一個都大,則j退出迴圈時, j == i,則array[0,i]為有序列,無需插入if ( j != i ){// 將[j,i-1]順序右移,騰出array[j]位置for (int k = i - 1; k >= j; k--)array[k + 1] = array[k];// 插入array[j] = tmpV;}System.err.println(i + "----" + Common.print(array));}}// 迴圈測試次數public static int LOOP_COUNT = 1;public static int ARRAY_SIZE = 7;public static void main(String[] args){int[] mArray = Common.getArray(ARRAY_SIZE);int allTime = 0;for (int i = 0; i < LOOP_COUNT; i++){// 拷貝數組int[] tmpArray = Arrays.copyOf(mArray, ARRAY_SIZE);Common.print(tmpArray);long tmpTime = System.currentTimeMillis();execute(tmpArray);Common.print(tmpArray);allTime += System.currentTimeMillis() - tmpTime;}System.err.println("數組大小為(" + ARRAY_SIZE + ")的" + LOOP_COUNT + "次插入排序的平均耗時為:" + allTime / (float) LOOP_COUNT);}}
1----58 80 15 27 01 68 43 2----15 58 80 27 01 68 43 3----15 27 58 80 01 68 43 4----01 15 27 58 80 68 43 5----01 15 27 58 68 80 43 6----01 15 27 43 58 68 80
數組大小為(10000)的100次直接插入排序的平均耗時為:17.58 ms
【資料結構與演算法 03】直接插入排序