1、数据结构学习笔记一、数据结构算法实现1、排序算法集锦1、直接插入排序:代码:/插入排序。/时间复杂度:O(n)。空间复杂度:O(1)。为稳定排序。#include#includevoid InsertSort(int a,int n)/对顺序表做直接插入排序。intj,k;for(j=2;j=n;j+) if(ajaj-1)/,需将其插入顺序表。 a0=aj;/复制为哨兵。aj=aj-1;for(k=j-2;a0ak;k-) ak+1=ak;/记录后移。 ak+1=a0; /插入到正确位置。 int main()int a100,n,i;printf(请输入要进行排序的数的个数n:n);sca
2、nf(%d,&n);printf(请输入这n个数:n);for(i=1;i=n;i+)scanf(%d,&ai);InsertSort(a,n);printf(排序后的n个数是:n);for(i=1;i=n;i+)printf(%4d,ai);printf(n);system(pause); 数据测试:2、折半插入排序代码:/折半插入排序。/时间复杂度:O(n)。空间复杂度:O(1); #include#includevoid BInsertSort(int a,int n)/对顺序表做折半插入排序。intj,k;for(j=2;jn;j+)a0=aj;int low=1,high=j-1;
3、while(low=high)/在alow.high中折半查找正确插入位置。int m=(low+high)/2;if(a0=high+1;k-)/记录后移。ak+1=ak; ahigh+1=a0;/插入。 int main()int a100,n,i;printf(请输入要进行排序的数的个数n:n);scanf(%d,&n);printf(请输入这n个数:n);for(i=1;i=n;i+)scanf(%d,&ai);BInsertSort(a,n);printf(排序后的n个数是:n);for(i=1;i=n;i+)printf(%4d,ai);printf(n);system(pause
4、); 数据测试:3、希尔排序:代码:/希尔排序。/时间复杂度:O(nlogn)。空间复杂度:O(1)。为不稳定算法。#include#includevoid ShellInsert(int a,intn,intdk)/对顺序表a做一趟希尔插入排序。intj,k;for(j=dk+1;j=n;j+)if(aj0&a0ak;k-=dk)ak+dk=ak; ak+dk=a0; void ShellSort(int a,intn,intdlta,int t)/按增量序列dlta对顺序表做希尔排序。int m;for(m=0;mt;m+)ShellInsert(a,n,dltam);int main()
5、int a100,dlta20,n,t,i;printf(请输入要进行排序的数的个数n:n);scanf(%d,&n);printf(请输入这n个数:n);for(i=1;i=n;i+)scanf(%d,&ai);printf(请输入增量序列数的个数t:n);scanf(%d,&t);printf(请输入增量序列:n);for(i=0;it;i+)scanf(%d,&dltai);ShellSort(a,n,dlta,t);printf(排序后的n个数是:n);for(i=1;i=n;i+)printf(%4d,ai);printf(n);system(pause);数据测试:4、冒泡排序代码
6、:/起泡排序。/时间复杂度: O(n2)。空间复杂度:O(1)。为稳定排序算法。#include#includevoidBubbleSort(int a,int n)inti,j,temp;for(i=1;i=n-1;i+)for(j=1;jaj+1)temp=aj;aj=aj+1;aj+1=temp; int main()int a100,n,i;printf(请输入要进行排序的数的个数n:n);scanf(%d,&n);printf(请输入这n个数:n); for(i=1;i=n;i+)/注意数组的起始位置。scanf(%d,&ai);BubbleSort(a,n);printf(排序后的
7、n个数是:n);for(i=1;i=n;i+)printf(%4d,ai);printf(n);system(pause); 数据测试:5、快速排序:代码:/快速排序。/时间复杂度:O(nlogn)。空间复杂度:O(logn)。为不稳定算法。#include#includeint Partition(int a,intn,intlow,int high)/返回枢轴所在位置。intpivotkey;a0=alow;pivotkey=alow;while(lowhigh)while(lowpivotkey)high-;alow=ahigh;while(lowhigh&alowpivotkey)lo
8、w+;ahigh=alow; alow=a0;return low;void QuickSort(int a,intn,intlow,int high)/递归形式快排。intpivotloc;if(lowhigh)pivotloc=Partition(a,n,low,high);QuickSort(a,n,low,pivotloc-1); QuickSort(a,n,pivotloc+1,high); int main()int a100,n,i;printf(请输入要进行排序的数的个数n:n);scanf(%d,&n);printf(请输入这n个数:n); for(i=1;i=n;i+)/注
9、意数组的起始位置。scanf(%d,&ai);QuickSort(a,n,1,n);printf(排序后的n个数是:n);for(i=1;i=n;i+)printf(%4d,ai);printf(n);system(pause); 数据测试:6、简单选择排序代码:/简单选择排序。/时间复杂度:O(n2)。空间复杂度:O(1)#include#includeintSelectMinKey(int a,intn,int i)intj,min;min=i;for(j=i+1;j=n;j+)if(ajamin)min=j; return min;voidSelectSort(int a,int n)i
10、nti,j,temp;for(i=1;in;i+) j=SelectMinKey(a,n,i); if(i!=j)temp=ai;ai=aj;aj=temp; int main()int a100,n,i;printf(请输入要进行排序的数的个数n:n);scanf(%d,&n);printf(请输入这n个数:n); for(i=1;i=n;i+)/注意数组的起始位置。scanf(%d,&ai);SelectSort(a,n);printf(排序后的n个数是:n);for(i=1;i=n;i+)printf(%4d,ai);printf(n);system(pause);数据测试:7、堆排序代
11、码;数据测试:8、归并排序代码:/归并排序。/时间复杂度:O(nlogn)。空间复杂度:O(n)。#include#includevoid Merge(int SR,int TR,intn,inti,intm,int t) /将有序的ai.m和am+1.t合并为有序的TRi.t。intj,k;for(j=m+1,k=i;i=m&j=t;k+)if(SRi=SRj)TRk=SRi+;else TRk=SRj+; if(i=m)while(i=m)TRk+=SRi+; if(j=t)while(j=t)TRk+=SRj+; voidMSort(int SR,int TR,intn,ints,int
12、 t) /将 SRs.t归并排序为TRs.t。int m,TR1100;if(s=t)TRs=SRs;else m=(s+t)/2;MSort(SR,TR1,n,s,m);/递归地将SRs.m归并为有序的TR1s.m。MSort(SR,TR1,n,m+1,t);/递归地将SRm+1.t归并为有序的TR1m+1.t。 Merge(TR1,TR,n,s,m,t);/将TR1s.m、TR1m+1.t归并到TR1s.t; voidMergeSort(int a,int n)MSort(a,a,n,1,n);int main()int a100,n,i;printf(请输入要进行排序的数的个数n:n);
13、scanf(%d,&n);printf(请输入这n个数:n); for(i=1;i=n;i+)/注意数组的起始位置。scanf(%d,&ai);MergeSort(a,n);printf(排序后的n个数是:n);for(i=1;i=n;i+)printf(%4d,ai);printf(n);system(pause);数据测试:2、链表与数组1、假定数组AN的n个元素中有多个零元素,编写算法将A中所有的非零元素依次移到A的前端。【华中科技大学,06年】代码:#include#includeint main()int a100,n,i;while(1)printf(please input th
14、e number of the array:n);scanf(%d,&n);printf(please input every value in the array:n);for(i=0;in;i+)scanf(%d,&ai);int p=-1,q=0,m=0;for(i=0;i0&q0) ap=ai;/移动非零元素至前面。 /ai=0; q-;/零元素个数减1。if(q0)p+; else if(m0)ai-m=ai; printf(the values after removing:n);for(i=0;in;i+)printf(%4d,ai);printf(n);system(pause
15、); 数据测试:2、顺序存储的线性表,其数据元素为整型,试编写一算法,将A拆分成B和C两个表,使A中的元素值大于等于0的存入B,小于0的存入C中。要求:(1)表B和C另外设置存储空间。 (2)表B和C不另外设置,而利用A的空间。(1)代码:#include#includeint main()int A10=1,2,3,-4,-7,5,7,-9,8,-2;int B10,C10;inti,j,k; i=j=k=0;for(i=0;i=0)Bj+=Ai;else Ck+=Ai;printf(拆分前:n);printf(A:);for(i=0;i10;i+)printf(%4d,Ai);printf
16、(n);printf(拆分后:n);printf(B:);for(i=0;ij;i+)printf(%4d,Bi);printf(n);printf(C:);for(i=0;ik;i+)printf(%4d,Ci);printf(n);system(pause);数据测试:(2)代码:#include#includeint main()int A10=1,2,3,-4,-7,5,7,-9,8,-2;int i=0,j=9,temp,t=0; printf(拆分前:n);printf(A:);for(t=0;t10;t+)printf(%4d,At);printf(n);while(i=0)i+
17、;while(Aj0)j-;if(ij)temp=Ai; Ai=Aj; Aj=temp; printf(拆分后:n);printf(B:);for(t=0;ti-1;t+)printf(%4d,At);printf(n);printf(C:);for(t=i;tnext;pr=null;while(p)h-next=pr;pr=h; h=p; p=p-next; 4、删除顺序表中元素长度为n的线性表A采用顺序存储方式,写算法删除线性表中所有值为item的数据元素。要求:时间复杂度为O(n),空间复杂度为O(1)。5、将数组偶数移至奇数之前设计将数组An中所有的偶数移到奇数之前的算法。要求:不增
18、加存储空间,且时间复杂度为O(n)。代码:#include#includeint main()int A20=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20;inti,j,x; /x=A0; i=0; j=19;while(ij) x=Ai;while(Aj%2=1)j-;if(ij) Ai=Aj;i+; if(ij)while(Ai%2=0)i+;if(ij) Aj=Ai; j-; Ai=x; for(i=0;i20;i+)printf(%d ,Ai);printf(n);system(pause);数据测试:6、逆序输出单链表各元素代码
19、:#include#includetypedefstruct nodechar data;struct node *next; list;typedef list *link;link Create()/创建链表。charch;list *p;link head;head=NULL;ch=getchar();while(ch!=n) p=(list *)malloc(sizeof(list); p-data=ch;p-next=head;head=p;ch=getchar(); return head;void Display(link head)list *p; p=head;printf(
20、头插法建立的链表的输出结果:n);while(p)printf(%c,p-data); p=p-next; printf(n);int main()link head;printf(请输入链表的内容:n);head=Create();Display(head);system(pause);数据测试:7、合并两个单链表()A为递增有序的单链表,长度为n。B为递减有序的单链表,长度为m。编写程序,利用原表的存储空间,将A、B合并成为一个递增有序的单链表。要求:时间复杂度为O(m+n)。算法:/先将单链表B逆转:void Reverse(Node *r) Node *q=r,*p=null,*tem
21、p;while(q)temp=q; q=q-next;temp-next=p; p=temp; r=p;/再合并两个非递减的单链表:Node *Merge(Node *a,Node *b) Node *s,*r; Node *p=a,*q=b;while(p!=NULL&q!=NULL)if(p-datadata)if(p=a) s=a; r=a; else r-next=p; p=p-next; elseif(q=b) s=b; r=b; else r-next=q; q=q-next; r=r-next; if(p=NULL&q!=NULL)r-next=q;if(q=NULL&p!=NU
22、LL)r-next=p;return s;/主方法。合并题目所给的两个单链表。Node *MergeFunc(Node *a,Node *b) Reverse(b); Node *result=Merge(a,b); resultresult;8、合并两个单链表()单链表A、B,数据都为整型有序,编写程序,利用原节点,将A和B中具有相同数据的节点删除,并将B中与原A表不同数据的节点插入A中,保持A的递增有序。算法:void Merge(Node *a,Node *b) Node *p,*q,*previous; Node *temp1,*temp2; /假设a、b带头节点。 p=a-next;
23、 q=b-next; previous=a; while(p!=NULL&q!=NULL) if(p-datadata) previous=p;/previous指示p的前驱。 p=p-next; else if(p-data=q-data) temp1=p; p=p-next; previous-next=p-next; delete temp; else temp2=q; q=q-next; previous-next=temp; temp-next=p; previous=previous-next; if(p=NULL&q!=NULL)previous-next=q;9、两个单链表求和已知2个按元素非递减的单链表A和B,设计一算法利用原表节点空间形成连续的新链表A和B,使得A=AB,B=AB。算法:void Adjust(LinkList&A,LinkList&B) /假设A、B带头结点。 pa=A; pb=B; while(pa-next!=NULL&pb-next!=NULL) if(pa-next-datanext-data) pa=pa-next; else if(pa-next-data=pb-next-data)pa=pa-next;pb=pb-next; elsetemp=pb-next;pb-ne
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1