排序 KMP演算法 佇列 棧

2022-09-10 05:30:11 字數 2665 閱讀 5672

一、希爾排序

1.初次取序列的一半為增量,以後每次減半,直到增量為1(round(n/2)--->1)

2.每組遍歷

3.組內排序

1

//希爾排序

2int shell_sort(int *data, int

len)

315 data[j + gap] =temp;16}

17}1819

return0;

20 }

二、快速排序

1.第乙個值為哨兵,從後面往前面找,找到比它小的,然後替換;從前面往後面找,找到比它大的,然後替換;

2.然後以第乙個key為基準,資料分為兩部分,分別是key的左邊部分和key右邊部分;分別對這兩部分的資料進行遞迴;

//

快速排序

int sort(int *data, int left, int right) //

每一次遞迴, 每呼叫一次, 確定乙個key的正確位置

data[i] =data[j];

while (i < j && key >= data[i]) //

從前面往後面走,找到大於key的值,然後替換

data[j] =data[i];

}//i == j,此時確定了key的所在順序的正確位置

data[i] =key;

//遞迴

sort(data, left, i - 1

); sort(data, i + 1

, right);

return0;

}int quick_sort(int *data, int

len)

三、鍊錶常考知識點

1.單向鍊錶如何找到倒數n個節點

雙指標法:

(1) p2往後移動n個節點,此時p1和p2之間的距離剛好為n

(2) 同時往後移動p1,p2,當p2是尾節點時,p1剛好移動到倒數第n個節點

struct

node

;struct node *lastnode(struct node *head, int

n)

if (p2 == null) /*

說明鍊錶數目不足n個

*/

while (p2->next != null) //

雙指標移動,當p2是尾節點時,p1剛好移動到倒數第n個節點

return

p1;}

2.判斷鍊錶是否有環?

快慢指標法:

(1)慢指標slow每次往前走一步(slow = slow->next),快指標fast每次往前走兩步(fast = fast->next->next);

(2)如果有環,fast一定會先進入環,而slow後進入環。當兩個指標都進入環之後,經過一定步的操作之後二者一定能夠在環上相遇;

int has_cycle(struct node *head)

}return0;

}

3.判斷兩個鍊錶是否交叉,並返回交點

雙指標移動法:   

長的鍊錶先走abs(len1 - len2)步,此時兩個鍊錶剩餘的長度一樣長,兩個鍊錶再同時往後移動,如果有相等則相交;

struct node *intersect_list(struct node *heada, struct node *headb)

return

small;

}

4.鍊錶反轉

就地反轉,乙個頭節點,兩個指標。

struct node *reverse_list(struct node *head)

//新建乙個空頭節點,連線 head節點

struct node *dummy;

dummy->data = -1

; dummy->next =head;

//新建兩個指標

struct node *prev = dummy->next;

struct node *pcure = prev->next;

while (pcure !=null)

return dummy->next;

}

四、kmp演算法

字串匹配演算法

(1)求出公共部分最長的長度;

(2)下一次對比陣列(next資料)

void make_next(const

char *pattern, int *next)

if (pattern[q] ==pattern[k])

next[q] =k;

}}int kmp(const

char *text, const

char *pattern, int *next)

#endif

if (pattern[q] ==text[i])

if (q ==m)

}return -1;}

intmain()

;

int idx =kmp(text, pattern, next);

printf(

"match pattern:%d\n

", idx);

return0;

}

棧排序,佇列排序

同學給我出了乙個棧排序的題,意思給乙個包含無序數的棧,讓輸出乙個順序排列的棧。直接排序是不可能的,棧只能在一端進行操作。因此需要借助輔助棧。思路是將原棧s的資料壓入輔助棧s2,輔助棧用於儲存最終結果。輔助棧中的元素是有序的。壓棧過程需要比較兩個棧棧頂元素大小關係。如果s棧頂小於s2的棧頂元素,則需要...

演算法 佇列,棧

佇列 當我們在火車站排隊時,第乙個排隊的人會第乙個買到票,而後面來的只能排在最後,這種情況就是佇列。c語言中也有相應的情況,如 現有一串加密的數字,你需要解密,規則如下 首先將第乙個數字刪除,然後將第二個數字放在最後一位上,再將第三個數字刪除並把第四個數字放在最後一位上,以此類推,知道剩下最後乙個數...

棧 佇列和排序

棧,順序表和煉表都能實現 stack 建立乙個新的空棧 push item 新增乙個新的元素item到棧頂 pop 彈出棧頂元素 peek 返回棧頂元素 is empty 判斷棧是否為空 size 返回棧的元素個數 佇列和棧同理 queue 建立乙個空的佇列 enqueue item 往佇列中新增乙...