基 础 算 法 总 结(原创)
由 王宇 原创并发布:
算法:数据的组织方法,数据结构是算法的载体。
数据结构包括:数组、链表、树、堆栈、队列
以下代码均在linux 环境下,gcc v4.5 编译调试通过。
排序:
直接插入排序:
时间复杂度:O(N^2)
思想:
R[n] 分成两个序列区:有序区R(j) (j = 0 j<i), 无序区R[i] (i=1...n-1),将无序区中的元素,插入到有序区适当的位置
实现代码:
#include<stdio.h> int main() { int R[16]={2,5,1,4,8,6,0,9,3,7,11,10,12,15,14,13}; int i,j,temp,n=16,p; for(i=1;i<n;i++) //R[i=1......n-1] 无序区中遍历 { for(j=0;j<i;j++) //R[i] 有序区中遍历 { if(R[j]<R[i]) //比较交换 { temp=R[j]; R[j]=R[i]; R[i]=temp; } } } for(p=0;p<n;p++) //打印输出结果 { printf("%d, ",R[p]); } printf("\n"); return 0; }
希尔插入:
时间复杂度:O(N*(logN))
思想:
分治法,直插法:按照步长,进行分组,然后进行各组的插入排序.减少交换次数
实现代码:
#include<stdio.h> int main() { int R[16]={2,5,1,4,8,6,0,9,3,7,11,10,12,15,14,13}; int i,j,temp,n=16,p,step; /*缩减法,分组*/ for(step = n/2;step > 0;step /= 2) { /*直接插入法,排序*/ for(i=step;i<n;i++) //无序区中遍历 { for(j=i-step;j<i;j++) //有序区中遍历 { if(R[j]<R[i]) //比较交换 { temp=R[j]; R[j]=R[i]; R[i]=temp; } } } } for(p=0;p<n;p++) //打印输出结果 { printf("%d, ",R[p]); } printf("\n"); return 0; }
选择排序:
时间复杂度:O(N^2)
思路:
R[n]分成两个序列区:在R[j]序列中选择最小的 (j =i+1 j<n),放入R[i]位置,作为已经排好的序列.(i = 0 i < n)
实现代码:
#include<stdio.h> int main() { int R[10] = {4,3,5,7,6,2,1,8,9,0}; int i,j,temp,n=10,p; for(i = 0;i < n;i++) //将选择的值,放在R[i]的位置 { for(j = i+1;j < n ;j++) //R[n]序列中选择最小的 { if(R[j] > R[i]) //比较交换 { temp=R[j]; R[j]=R[i]; R[i]=temp; } } } for(p=0;p < n;p++) //打印输出结果 { printf("%d",R[p]); } printf("\n"); return 0; }
冒泡排序:
时间复杂度:O(N^2)
思路:
R[n]序列,i=0,R[i]同R[i+1]比较,交换n-1次
#include<stdio.h> int main() { int R[10]={7,3,8,4,9,5,6,2,1,0}; int i,j,n=10,p,q,temp; for(i=n-1;i>0;i--) //n-1次交换 { for(j=0;j<i;j++) // i=0 R[i] 同 R[i+1]比较 { q=j+1; if(R[q]>R[j]) //比较交换 { temp=R[j]; R[j]=R[q]; R[q]=temp; } } } for(p=0;p<n;p++)//打印输出结果 { printf("%d",R[p]); } printf("\n"); return 0; }
快递排序 (不稳定排序):
时间复杂度:O(N*LogN)
思路:分治法,基准法:R[n]中找到基准点pivot,分成左右两个区域R[0..pivot-1] R[pivot+1..n-1],一部分的所有数据,要比另一部分的数据都小,递归解决
#include<stdio.h> /*递归,分治*/ void quickSort(int *R,int low,int height) { int pivot; if(low<height) { pivot=partition(R,low,height); //寻找基准 quickSort(R,low,pivot-1); //R[0..pivot-1] quickSort(R,pivot+1,height); //R[pivot+1..n-1] } } /*基准法*/ int partition(int *R,int i,int j) { int pivot=R[i]; while(i<j) { while(i<j && pivot<R[j] ) //从左向右同基准比较并移动交换 { j--; } if(i<j) R[i++]=R[j]; while(i<j && pivot>R[i]) //从右向左同基准比较并移动交换 { i++; } if(i<j) R[j--]=R[i]; } R[i]=pivot; return i; } int main() { int R[10]={0,2,8,4,7,3,6,5,1,9}; int p; quickSort(R,0,9); //调用快速排序 for(p=0;p<10;p++) //打印输出结果 { printf("%d",R[p]); } printf("\n"); return 0; }
归并排序 (稳定排序):
思路:
归并,二分法(递归)
归并操作:
R[n]无序队列m处分两组R[0..m]R[m+1...n-1]申请长度n的空间R1[n]
对比两个分组,将较小的先放入R1
将第一组剩余的放入R1
将第二组剩余的放入R1
将R1复制回R中
#include<stdio.h> #include<stdlib.h> void merge(int *R,int low,int mid,int high) { int i=low,j=mid+1,p=0; int *R1; R1=(int *)malloc((high-low+1)*sizeof(int)); if(!R1) perror("error:malloc"); while(i<=mid && j<=high) //对比两个分组,将较小的先放入R1 { R1[p++]=(R[i]<R[j]) ? R[i++] : R[j++]; } while(i<=mid) //将第一组剩余的放入R1 { R1[p++]=R[i++]; } while(j<=high) //将第二组剩余的放入R1 { R1[p++]=R[j++]; } for(i=low,p=0;i<=high;i++,p++) // 将R1复制回R中 { R[i]=R1[p]; } free(R1); } void mergeSort(int *R,int first,int last) { int mid; if(first<last) { mid=(last+first)/2; //二分法 mergeSort(R,first,mid); //R[low..m]递归分治 mergeSort(R,mid+1,last);//R[m+1...hight]递归分治 merge(R,first,mid,last); //归并操作 } } int main() { int R[10]={5,0,9,3,8,2,7,1,6,4}; int i,j,temp,p,n=10; mergeSort(R,0,9); //调用归并算法 for(p=0;p<n;p++) //打印输出结果 { printf("%d",R[p]); } printf("\n"); return 0; }
二叉树
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #define MAX_CNT 5 typedef struct Tree_Struct{ int key; struct Tree_Struct * left; struct Tree_Struct * right; }Tree_Struct; void make_node(int target,Tree_Struct ** ppTree){ Tree_Struct * pTree_m=(Tree_Struct *)malloc(sizeof(Tree_Struct)); if(!pTree_m) perror("malloc error!"); pTree_m->key = target; pTree_m->left = NULL; pTree_m->right = NULL; *ppTree=pTree_m; } void insert_node(Tree_Struct ** ppNode,int target){ Tree_Struct * node = *ppNode; if(node == NULL){ make_node(target,&node); *ppNode = node; return; } if(node->key == target){ return; }else if(node->key > target){ insert_node(&node->left,target); *ppNode = node; return; }else{ insert_node(&node->right,target); *ppNode = node; return; } } int get_high(Tree_Struct ** ppNode){ int left_high=0,right_high=0; Tree_Struct * tree = *ppNode; if(tree == NULL){ return 0; }else{ left_high = get_high(&tree->left); right_high = get_high(&tree->right); return left_high > right_high ? left_high+1 : right_high+1; } } void pre_order(Tree_Struct * root){ if(root != NULL){ printf("%d ",root->key); pre_order(root->left); pre_order(root->right); }else{ printf(" # "); } } void in_order(Tree_Struct * root){ if(root != NULL){ in_order(root->left); printf("%d ",root->key); in_order(root->right); }else{ printf(" # "); } } void post_order(Tree_Struct * root){ if(root != NULL){ post_order(root->left); post_order(root->right); printf("%d ",root->key); }else{ printf(" # "); } } int main(){ int i,high=0,srand_int=0; Tree_Struct * root=NULL; srand((unsigned)time(NULL)); printf("Original number list : "); for(i=0;i<MAX_CNT;i++){ srand_int = rand() % 100; printf("%d ",srand_int); insert_node(&root,srand_int); } //前序 printf("\nPer Order:\n"); pre_order(root); printf("\n"); //中序 printf("In Order:\n"); in_order(root); printf("\n"); //后序 printf("Post Order:\n"); post_order(root); printf("\n"); //层高 printf("Tree level high:"); high = get_high(&root); printf("%d \n",high); return 0; }
单链表等待序
查找:
相关推荐
**标题:“我的OI算法总结。原创。”** 这篇文章的作者分享了他在OI(奥林匹克信息学)竞赛中的算法学习和实践经验,涵盖了图论算法、动态规划(DP)以及基础算法的总结。OI是信息学奥林匹克竞赛的缩写,它涉及到...
在信息技术领域,算法研究是核心技术之一,它不仅是计算机科学的基础,也是解决各类问题的基本工具。本文档《十五个经典算法研究与总结》是一份详细探讨了多个重要算法的系列文章。该文档由July撰写,时间跨度从2010...
伪原创词库,顾名思义,是一系列经过特殊处理的词汇或短语,用于帮助创作者修改或重写已有内容,使其在保持原意的基础上,呈现出与原文不同的表达方式。这种做法的主要目的是为了提高搜索引擎排名,避免被识别为重复...
快递选择SELECT等15个经典基础算法,共计31篇文章,包括算法理论的研究与阐述,及其编程的具体实现。很多个算法都后续写了续集,如第二个算法:Dijkstra 算法,便写了4篇文章;sift算法包括其编译及实现,写了5篇...
伪原创是指在原有内容的基础上,通过更改标题、调整段落顺序、替换关键词等手段,使得新内容与原内容在表面上有所不同,但实质内容保持一致的技术方法。这种方法常被用于SEO优化和网络内容创作领域。 #### 2. 伪...
2. **生成新解**:在当前解的基础上生成一个邻域解,通常通过交换两个城市的位置来实现。 3. **计算能量变化**:根据新解和旧解之间的差异计算“能量”变化,即旅行距离的增减。 4. **接受准则**:依据接受概率...
BP神经网络算法是神经网络学习的基础,理解并掌握其原理和实现方法对于深入学习领域至关重要。尽管存在一些局限,如训练速度慢、可能陷入局部最优等,但通过改进优化策略和结合其他深度学习技术,BP神经网络仍能在...
总结:通过对“智动伪原创”软件的分析,我们可以了解到它是一款集成了多种文本处理技术的工具,用于生成搜索引擎友好的原创内容,以提升网站的SEO效果。通过各种动态链接库文件和算法,它可以实现智能分词、语义...
总结来说,伪原创SEO是一种优化策略,它通过改写和重组已有内容来提升搜索引擎排名。然而,它需要平衡搜索引擎的需求与用户体验,尊重版权,并随时适应算法变化。合理的伪原创技巧和工具运用,配合优质内容的产出,...
总结以上知识点,EM算法课件讲义中涵盖了最大似然估计、Jensen不等式、K-means算法、高斯分布参数估计、高斯混合模型以及坐标上升算法等重要概念,并通过实例演示的方式让学习者能够快速掌握EM算法的理论与实践应用...
本调研报告建立在大量阅读论文的基础上,总结了2G,3G,4G的认证与空口加密算法的具体实现和三者的变化和比较。2G主要介绍GSM系统的认证算法COMP128以及A5算法,3G主要介绍f8算法及双向认证模式;4G介绍认证和加密在3G...
2. **平台算法机制**:了解抖音等平台的推荐算法机制是提高原创度的关键。平台通常会通过多种技术手段来识别和判断内容的原创性。 3. **深度去重技术**:这是一种通过改变视频的多个元素(如画面、声音等),使其与...
抖音算法的目标是推动原创且用户喜欢的内容,同时限制无原创价值和用户不喜欢的视频。因此,创作者应当专注于制作高质量、垂直定位的内容,提高观众的互动率,以获得更多的推荐曝光。同时,避免违规操作,因为这将...
采集功能允许用户快速获取大量与关键词相关的网络内容,这些内容可以作为撰写高质量原创文章的基础。通过整合并重组这些信息,用户可以创建出既具有独特性又包含丰富关键词的文章,这对于提升网站的搜索引擎友好度至...
### 二级C++错题总结 #### 一、基础知识与概念理解 1. **循环队列**:循环队列作为一种...以上内容涵盖了C++基础语法、数据结构与算法、面向对象编程等多个方面的重要知识点,对于备考二级C++的同学来说非常有价值。
在准备期末考试时,考生应重点掌握这些基础知识,并通过做题来熟悉各种算法的实现和应用。对于每个考点,不仅要理解其理论,还要熟练运用,通过练习题不断巩固。此外,对误差分析的理解和应用也是考试中的重要考核点...
- **原创性**:课程总结必须独立完成,不得抄袭或复印他人作品。这旨在培养独立思考和自主学习的能力。 - **电子版提交**:以Word格式保存并上传至课程平台,方便教师批阅和同学交流。 通过以上详尽的总结,学生...
算法设计的过程涵盖了数据结构、高级语言程序设计、离散数学、图论、组合数学、人工智能、计算几何等多个领域的基础知识。此外,算法设计还涉及到其他学科的知识,因为很多问题的解决不仅需要编程技能,还需要对问题...
《算法艺术与信息学竞赛》是一本深入浅出地介绍算法学基础知识的书籍,适合于信息学竞赛的参加者们。该书系统地分析和讲解了算法与数据结构、数学知识和方法、计算几何等在程序设计竞赛中的应用问题,旨在帮助读者们...