一.常見的排序與kmp
插入排序:通過構造有序序列,對於未排序的資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。
int
insertionsort
(int
*array,
int length)
array[preindex+1]
= current;
}return1;
}
希爾排序:第乙個突破o(n2)的排序演算法,是插入排序的改進版。
演算法描述:
先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,具體演算法描述:
選擇乙個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
按增量序列個數k,對序列進行k 趟排序;
每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子串行,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為乙個表來處理,表長度即為整個序列的長度。
/*
**希爾排序
*/int
shellsort
(int
*array,
int length)
array[preindex + gap]
= current;}}
return1;
}
kmp演算法#include
#include
#include
#include
typedef
struct node listnode;
//列印資訊
void
showlist
(listnode *head)
printf
("\n");
}//初始化鍊錶
//islink :true 建立有環鏈表
listnode *initlist (
int n, bool islink)}if
(islink)
else
return head;
}//創造第二個相交鍊錶
listnode *
createtwointersectlist
(listnode *first,
const
int n)
for(
int i =
0; i < n/
2; i++
) target->next = temp;
return second;
}/*在單向鍊錶中快速找到倒數第n個節點*/
listnode *
getlastnnode
(listnode *head,
int n)
if(first !=
null
)while
(first !=
null
)return second;}/*
判斷鍊錶是否有環
思路:快慢指標
*/bool judgelistring
(listnode *head)
}return false;
}/*判斷兩個鍊錶是否交叉*/
listnode *
intersectlist
(listnode *head1, listnode *head2)
listnode *first = head1,
*second = head2;
int head1num =
0, head2num =0;
while
(first->next !=
null
)while
(second->next !=
null)if
(first != second)
int differnum =
(head1num > head2num)
?(head1num - head2num)
:(head2num - head1num);if
(head1num > head2num)
else
while
(differnum--
)while
(first != second)
return first;
}/*鍊錶反轉*/
listnode *
reversenodelist
(listnode *head)
return prev;
}//2.頭節點插入法
int main (
)
常見資料結構與演算法 選擇排序
常見資料結構與演算法 選擇排序 一.選擇排序概述 1 選擇排序總結 選擇排序 屬於選擇排序 兩兩比較大小,找出極值 極大值或極小值 被放置在固定的位置,這個固定位置一般指的是某一端 結果分為公升序和降序排列 降序n個數從左至右,索引從0開始到n 1 兩兩依次比較,記錄大值索引,此輪所有數比較完畢,將...
資料結構與演算法 排序
排序原理 1.比較相鄰的元素。如果前乙個元素比後乙個元素大,就交換這兩個元素的位置。2.對每一對相鄰元素做同樣的工作,從開始第一對元素到結尾的最後一對元素。最終最後位置的元素就是最大 值。氣泡排序的 實現 public static void sortpop int arr 測試 public st...
《資料結構與演算法 排序》
1 快速排序 1.記錄 排序中的結點 2.檔案 一系列結點構成的線性表 3.排序又稱分類 4.排序碼 結點中乙個或者多個字段,其值作為排序運算中的根據。基本思想 每次選擇待排序的記錄序列的第1個記錄,按照排序碼的大小將其插入到已排序的記錄序列的適當位置,直到所有記錄全部排序完畢。最簡單的排序方法。整...