要說排序算法里面比較簡單的,我覺得直接插入排序算是一個。
直接插入排序的原理很簡單,就是把一個數字插入到一個有序的數組中。
比如有這么一個數組:
1,3,5,7然后要把 4 插進去。
過程不難,4跟 7 比,7大,把 7 往后移動;
4跟 5 比,5大,把 5 往后移動;
4跟 3 比,3小,于是直接把4放到第三個位置上。
但是問題又來了,去哪找一個有序的數組,排序本來就是沒有順序的。
于是就有了一個理論,如果一個數組中只有一個元素,那么它一定是有序的。
比如有這么一個數組:
6 4 5 3 7先把 6 當作一個單獨的數組,那么它一定是有序的。
把 4 插入到這個有序的數組中,先把 4 記下來,4跟 6 比,6向后移動,然后把 4 放到第一個位置。
4 6 5 3 7接下來再把 5 插入到4 6這個有序的數組中,過程一樣。
4 5 6 3 7循環下去,最終一定會得到一個有序的數組。
代碼也不難。
#include直接插入排序的效率很低,基本上跟冒泡是一個級別。 問題就出在移動的次數太多。#include #include #define SIZE 100000 void insert_sort(int *a, int size) { int i, j, num; for (i = 1; i < size; i++) { num = a[i]; for (j = i - 1; j >= 0; j--) { if (num < a[j]) { a[j + 1] = a[j]; } else { break; } } a[j + 1] = num; } } int main() { int num, arr[SIZE] = {0}, i; //隨機產生數組 srand(time(NULL)); for (i = 0; i < SIZE; i++) { arr[i] = rand() % 100; } insert_sort(arr, SIZE); for (i = 0; i < SIZE; i++) { printf("%d ", arr[i]); } printf(" "); return 0; }
6 4 5 3 7比如 3 這個元素,最終應該放在 6 這個位置上,但是這個過程需要跟每個數字比較并且向后移動。
于是有個叫做希爾的人就提出了改進思路,如果能讓 3 跳著來,速度就會提高很多。
后來就有了希爾排序。
第一步,先選取 2 作為步長,就是長度的一半,把原數組分成了兩個數組,一個是6 5 7,一個是4 3,對這兩個數組分別做直接插入排序。
6 5 7 4 3你會發現,這一次 3 直接和 4 交換了位置,一下子跳了兩步。
第二步,步長再縮減一半,就是1。
其實就是對整個數組做直接插入排序。
有些同學可能會有疑問,既然最終也是對整個數組做直接插入排序,為什么不一開始就這樣?
隨著步長的逐漸的縮減,數組會變得基本有序,雖然最后一步也是直接插入排序,但是移動的元素會很少。
希爾排序的效率要比直接插入排序高很多。
代碼也只需要做簡單的修改。
#include最后來試下 5 萬個數據排序,兩者的差距肉眼可見。#include #include #define SIZE 100000 void shell_sort(int *a, int size) { int i, j, num, h; for (h = size / 2; h > 0; h /= 2) { for (i = h; i < size; i++) { num = a[i]; for (j = i - h; j >= 0; j = j - h) { if (num < a[j]) { a[j + h] = a[j]; } else { break; } } a[j + h] = num; } } } int main() { int num, arr[SIZE] = {0}, i; //隨機產生數組 srand(time(NULL)); for (i = 0; i < SIZE; i++) { arr[i] = rand() % 100; } shell_sort(arr, SIZE); for (i = 0; i < SIZE; i++) { printf("%d ", arr[i]); } printf(" "); return 0; }
root@Turbo:test# time ./insert_sort real 0m1.740s user 0m1.724s sys 0m0.000s root@Turbo:test# time ./shell_sort real 0m0.008s user 0m0.004s sys 0m0.004s root@Turbo:test#
審核編輯:劉清
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
printf函數
+關注
關注
0文章
31瀏覽量
5921 -
Printf
+關注
關注
0文章
83瀏覽量
13732
原文標題:2分鐘看懂直接插入排序和希爾排序
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
十種常用排序法詳解總結和比較選擇
,并且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。 若要求排序穩定,則可選用歸并排序。但本章介紹的從單個記錄起進行兩兩歸并的排序
發表于 10-26 15:11
幾種c語言程序的排序包括應用程序等資料免費下載
本文檔的主要內容詳細介紹的是幾種c語言程序的排序包括應用程序好資料免費下載包括了:堆排序,改進冒泡排序,歸并排序,簡單插入排序,簡單選擇
發表于 09-29 08:00
?6次下載
插入排序和冒泡排序哪個更牛逼?
對于時間復雜度的分析,要把最好時間復雜度、最壞時間復雜度、平均時間復雜度分析出來,分別對應了排序算法的最好排序情況、最壞排序情況以及平均排序效率。
揭秘冒泡排序、交換排序和插入排序
01 — 冒泡排序 在實現冒泡排序代碼之前我們先理解一下什么是冒泡排序,我們舉一個現實生活中的例子來幫助我們理解。 操場排隊我們都知道吧,現
解析數據結構的常用七大排序算法
為了讓大家掌握多種排序方法的基本思想,本篇文章帶著大家對數據結構的常用七大算法進行分析:包括直接插入排序、希爾排序、冒泡排序、快速
光纖直接插入芯片,速度和效率驚人!
TeraPHY是一款光學I/O小芯片,擁有4Tbps的雙向帶寬,卻只有10W的功耗。這項技術的重要性在于,擺脫了傳統的PCB和長電氣走線的限制,通過直接插入芯片,實現了更高效的數據傳輸。
評論