本文介紹一些常用的簡單算法
冒泡排序
冒泡排序算法的原理如下:
1、比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
2、對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
3、針對所有的元素重複以上的步驟,除了最後一個。
4、持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
冒泡排序總的平均時間複雜度爲O(n^2)
void func_a(char *data, char size)
{
char i,j;
for(i=0;i<size-1;i++){
for(j=i+1;j<size;j++){
if(data[i] > data[j]){
char tmp = data[j];
data[j] = data[i];
data[i] = tmp;
}
}
}
}
int main(int argc, char *argv)
{
int i;
char data[] = {1,5,2,3,6,3,3,3,9,111,23,4,6};
func_a(data, sizeof(data));
}
快速排序
快速排序(Quicksort)是對冒泡排序的一種改進。
快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。
void func_b(char *data, char left, char right)
{
char i,j;
char key;
if(left >= right) return;
i = left;
j = right;
key = data[left];
while(i < j){
while(i < j && key <= data[j]){
j--;
}
data[i] = data[j];
while(i < j && key >= data[i]){
i++;
}
data[j] = data[i];
}
data[i] = key;
func_b(data, left, i-1);
func_b(data, i+1, right);
}
合併兩個有序數組,並排序
static void func(char *array1,char len1,char *array2,char len2,char *res)
{
char i = 0,j = 0,k = 0;
char min;
while(i < len1 && j < len2){
if(array1[i] > array2[j]){
min = array2[j];
j++;
}else{
min = array1[i];
i++;
}
res[k++] = min;
}
while(i < len1)
res[k++] = array1[i++];
while(j < len2)
res[k++] = array2[j++];
}
strstr的實現
char *strstr(const char *str1, const char *str2)
{
char *cp = (char*)str1;
char *s1, *s2;
if (!*str2)
return((char *)str1);
while (*cp)
{
s1 = cp;
s2 = (char *)str2;
while (*s1 && *s2 && (*s1 == *s2))
s1++, s2++;
if (!*s2)
return(cp);
cp++;
}
return(NULL);
}
持續更新中···