一、希爾排序
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個節點
structnode
;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(constchar *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 往佇列中新增乙...