哈露!小夥伴們!
又到了一天一次的葉子時間。廢話不多說。這次我將分享另乙個演算法
直接插入排序演算法;(從後向前找到合適位置後插入)
每步將乙個待排序的記錄,按其順序碼大小插入到前面已經排序的子串行的合適位置(從後向前找到合適的位置後),直到全部插入排序完為止。
這都是什麼東西!看完之後跟沒看一樣嘛!不過呢,沒關係!我們慢慢的分析。以下內容極易引起不適。非戰鬥人員請盡快離開!!!
好了正文開始:
顧名思義,插入排序就是拿後面往前插。這樣下面給出一組資料作為案例進行演示。
int arr = ;
//列舉出數字:16 4 10 19 95 24
/*首先從左往右看,拿第乙個數字作為基準數。這裡也就是16(arr[0]=16)下標是0
然後拿第二個數跟第乙個數進行比較。第二個數也就是4 下標是1
這裡開始比較
第一輪 起始下標位置 i=1
記錄下下標位置=1的元素值 temp = 4(這個數是拿出來準備插入到前面的,需要提前儲存起來)
16 4 10 19 95 24
接下來就開始比較:因為 4 的前面只有乙個數 所以直接比較就可以,判斷 4 前面這個數比 4 大。
也就是 16>4 為 true 。那麼就將 16 這個數向後挪,得到的結果如下:
16 16 10 19 95 24
接下來需要判斷一下是否這個16是第乙個數:下標為0的元素
(注意這裡的判斷是乙個迴圈,因為第一次比只有乙個數所以看不出來是不是迴圈。繼續看!)
當判斷前面比較的元素就是第乙個元素時,將記錄下的元素賦值給比它大的元素。
即:arr[i-1]=temp;(這裡的i-1代表的是16這個元素的下標)
這樣看來第一輪就結束了。得到的結果為:
4 16 10 19 95 24
第二輪 起始下標位置 i=2
記錄下下標位置=2的元素值 temp = 10
這裡前面因為有兩個元素。理論上需要比較兩次(視情況而定!)
有兩種情況:
第一種10>16。這裡後續就不需要比較了,因為前面已經比較過了。
第二種情況10<16。這裡後續的就需要依次比較了。
直到出現類似第一種的情況就不需要比較了。
判斷之後得到的結果是10<16 但 10>4 這裡需要記錄16的下標位置(就是i-1),得到的結果就是:
4 16 16 19 95 24
然後判斷是否比完了。迴圈結束,賦值 arr[i-1] = temp;
4 10 16 19 95 24
第三輪 起始下標位置 i=3
記錄下下標位置=3的元素值 temp = 19
照例判斷 因為19>16後續的就不需要判斷了。也就不需要交換。得到的結果就是:
4 10 16 19 95 24
第四輪 起始下標位置 i=4
記錄下下標位置=4的元素值 temp = 95
照例判斷 因為95>19後續的就不需要判斷了。也就不需要交換。得到的結果就是:
4 10 16 19 95 24
第五輪 起始下標位置 i=5
記錄下下標位置=5的元素值 temp = 24
照例判斷 24>95為false 需要後續的判斷。記錄下前面大於24的元素的下標就是i-1
繼續判斷 24>19為true 後續的就不需要判斷了。得到的結果就是向後挪一下
4 10 16 19 95 95
賦值 arr[i-1] = temp;
4 10 16 19 24 95
*/for (int j = 1; j < arr.length; j++)
arr[i + 1] = tmp;
}我是葉子!非常感謝你能看見我的文章。如有披露請指出!
初程面試中的那些事兒(7)
給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例 1 輸入 123 輸出 321示例 2 輸入 123 輸出 321示例 3 輸入 120 輸出 21注意 假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 231,231 1 請根據這個假設,如果反轉後整數...
開發中Performance的那些事兒
效能 這個詞,不管是在日常生活還是寫程式的時候,都經常被提到。比方說,買新電腦的時候,我們會說 原來的電腦效能跟不上了 寫程式的時候,我們會說,這個程式效能需要優化一下 那麼,你有沒有想過,我們常常掛在嘴邊的 效能 到底指的是什麼呢?我們能不能給效能下乙個明確的定義,然後來進行準確的比較呢?在計算機...
Python那些事兒 Python中的生成器
python使用生成器對延遲操作提供了支援,所謂延遲操作,是指在需要的時候才產生結果,而不是立即產生結果。gen exp i for i in range 10 生成器表示式 print gen exp generator for i in gen exp 取出生成器表示式的值,for迴圈 prin...