数据结构学习日记

    xiaoxiao2021-03-25  100

           我的目标是成为嵌入式软件工程师,所以现在自学数据结构。在”中国大学MOOC“上看视频学习,视频是浙江大学陈越、何钦铭老师讲的数据结构。从2017年3月1日-5月31日,今天已经是开课的第二周,因为上周有点忙,所以到了现在才把第一周的视频看完并把习题做了。

           期间,学习了调用系统函数clock()来检测程序运行的时间。

           clock()使用:

      1。 包含头文件 #include<time.h>。

      2。定义数据类型  clock_t   start, stop;

      3。duration=(double)(stop-start)/CLOCKS_PER_SEC

           本次课程最重要的是学习求,最大子列和。老师在课程中讲了4钟解法,我自己能做出第一、第二种,所以收获最大的就是学会了第三、第四种解法,第一次体会到了算法的魅力。

    #include<stdio.h> #include<stdlib.h> int MaxSubseqSum2(int num[],int k); int Max3(int A,int B,int C); int MaxSubseqSum3(int num[],int k); int DivideAndConquer(int num[],int left,int right); int MaxSubseqSum4(int num[],int k); int main(void) { int k; int zero=0; printf("第一行给出正整数K:"); scanf("%d",&k); printf("第二行给出K个整数,期间以空格分隔\n"); int *num=(int *) malloc (sizeof(int)*k); for(int i=0;i<k;i++) { scanf("%d",&num[i]); if(num[i]<=0) zero++; if(zero==(k-1)) { printf("0"); return 1; } } printf("%d\n",MaxSubseqSum2(num,k)); free(num); system("pause"); return 0; }算法2: /* * 最大子列和的算法2,时间复杂度:n^2 */ int MaxSubseqSum2(int num[],int k) { int ThisSum,MaxSum=0; for(int i=0;i<k-1;i++) { ThisSum=num[i]; for(int j=i+1;j<k;j++) { ThisSum+=num[j]; if(ThisSum>MaxSum) MaxSum=ThisSum; } } return MaxSum; }

    算法3: int Max3(int A,int B,int C) {   return A>B?A>C?A:C:B>C?B:C; } /* *  最大子列和的算法3,分而治之,时间复杂度:O(N log N),使用递归 */ int DivideAndConquer(int num[],int left,int right) { int MaxLeftSum,MaxRightSum; int MaxLeftBorderSum,MaxRightBorderSum; int LeftBorderSum,RightBorderSum; int center; if(left==right) {  if(num[left]>0)  return num[left];  else  return 0; } center=(left+right)/2; MaxLeftSum=DivideAndConquer(num,left,center); MaxRightSum=DivideAndConquer(num,center+1,right); MaxLeftBorderSum=0; LeftBorderSum=0; for(int i=center;i>=left;i--) {   LeftBorderSum+=num[i];   if(LeftBorderSum>MaxLeftBorderSum)   MaxLeftBorderSum=LeftBorderSum; } MaxRightBorderSum=0; RightBorderSum=0; for(int i=center+1;i<=right;i++) {   RightBorderSum+=num[i];   if(RightBorderSum>MaxRightBorderSum)   MaxRightBorderSum=RightBorderSum; } return Max3(MaxLeftSum,MaxRightSum,MaxLeftBorderSum+MaxRightBorderSum); } int MaxSubseqSum3(int num[],int k) { return DivideAndConquer(num,0,k-1); } 算法4: int MaxSubseqSum4(int num[],int k) { int ThisSum=0,MaxSum=0; int FistNum,LastNum; int i; int zero=0; for( i=0;i<k;i++) { ThisSum+=num[i]; if(ThisSum>MaxSum) { MaxSum=ThisSum; } else if(ThisSum<0) ThisSum=0; } return MaxSum ; } 哎,有点可惜的是,附加题没有做出来,要回去睡觉了,明天再来!

    转载请注明原文地址: https://ju.6miu.com/read-25312.html

    最新回复(0)