Linux C語言程式設計 六 查詢與排序

2021-07-03 19:41:58 字數 1896 閱讀 8426

演算法( algorithm) 是將一組輸入轉化成一組輸出的一系列計算步驟,其中每個步驟必須能在有限時間內完成。演算法是用來解決一類計算問題的,注意是一類問題,而不是乙個特定的問題。

這裡我們可以回想之前提到的遞迴演算法,遞迴就是演算法,而具體求解的過程,不能稱為演算法,而是演算法實現的過程。

插入排序演算法類似於玩撲克時抓牌的過程,玩家每拿到一張牌都要插入到手中已有的牌裡,使之從小到大排好序。

模擬一下我們的撲克牌的整理牌的過程,現在抓到一張7,把它和手裡的牌從右到左依次比較, 7比10小,應該再往左插, 7比5大,好,就插這裡。為什麼比較了10和5就可以確定7的位置?為什麼不用再比較左邊的4和2呢?因為這裡有乙個重要的前提:手裡的牌已經是排好序的。現在我插了7之後,手裡的牌仍然是排好序的,下次再抓到的牌還可以用這個方法插入。

#include #define len 5

int a[len] = ;

void insertion_sort(void)

a[i+1] = key;

} printf("%d, %d, %d, %d, %d\n",

a[0], a[1], a[2], a[3], a[4]);

}int main(void)

插入排序演算法採取增量式( incremental) 的策略解決問題,每次添乙個元素到已排序的子串行中,逐漸將整個陣列排序完畢,它的時間複雜度是θ(n2)。下面介紹另乙個典型的排序演算法——歸併排序,它採取分而治之( divide-and-conquer) 的策略,時間複雜度是θ(nlgn),優於插入排序演算法。歸併排序的步驟如下:

1)把長度為n的輸入序列分成兩個長度為n/2的子串行。

2)對這兩個子串行分別採用歸併排序。

3)將兩個排序好的子串行合併成乙個最終的排序序列。

在描述歸併排序的步驟時又呼叫了歸併排序本身,可見這是乙個遞迴的過程。

#include #define len 8

int a[len] = ;

void merge(int start, int mid, int end)

for (j = 0; j < n2; ++j)

i = j = 0;

for (k = start; i < n1 && j < n2; ++k) else

} if (i < n1) /* left is notexhausted */

for (; i < n1; i++)

if (j < n2) /* right is notexhausted */

for (; j < n2; ++j)

}void sort(int start, int end)

}int main(void)

線性查詢比較簡單,乙個乙個從前往後找就行了。如下的一段**:

#include char a="hello world";

int indexof(char letter)

return -1;

}int main(void)

折半查詢針對的是已經有序的帶查詢字串。

由於這個序列已經從小到大排好序了,每次取中間的元素和待查詢的元素比較,如果中間的元素比待查詢的元素小,就說明「如果待查詢的元素存在,一定位於序列的後半部分」,這樣可以把搜尋範圍縮小到後半部分,然後再次使用這種演算法迭代。這種「每次將搜尋範圍縮小一半」的思想稱為折半查詢:

#include #define len 8

int a[len] = ;

int binarysearch(int number)

return -1;

}int main(void)

Linux C程式設計 六 之 網路程式設計 上

網路協議棧 網路基礎 tcp連線的三次握手和四次揮手 三次握手 tcp協議通過三個報文段完成連線的建立,這個過程稱為三次握手 three way handshake 過程如下圖所示。當客戶端呼叫connect時,觸發了連線請求,向伺服器傳送了syn j包,這時connect進入阻塞狀態 伺服器監聽到...

Linux C語言程式設計基本原理與實踐

命令列模式下 a 在字元後插入字元 i 在字元前插入字元 shift a 在行尾插入字元 shift i 在行首插入字元 o 在下一行插入字元 shift o 在上一行插入字元 x 刪除當前字元 shift x 刪除當前字元的前乙個字元 dd 刪除當前行 u 撤銷操作 ctrl r 恢復操作 gg ...

linux c語言查詢指定程式pid

工作上需要向特定程序傳送user2訊號,查詢程序時找到乙個已經封裝好的介面,做個備忘。做為其它程式介面是在程式中加入 include pidof.h 關聯是加上pidof.c就可以了。如果做為單獨程式來使用,將.c中的 include pidof.h 注掉就能編了。ifndef pidof h de...