一.选择排序:
1.将元素分为已排序区和待排序区。
2.每一轮从待排序中选择最小值放到已排序区,直到待排序区没有元素为止。
时间复杂度o(n²);
#include<bits/stdc++.h> #include<algorithm> #include<iostream> using namespace std; void select_sort(int *arr, int l, int r) { for (int i = l; i < r ; i++) {//注意最后剩下的元素,如果输入是l=0;r=6;排序0-6的元素,那么第一个是<r;因为剩下一个不用排序;第二个是<=;因为都要参与排序 int ind = i; for (int j = i + 1; j <=r; j++) { if (arr[j] < arr[ind])ind = j; } swap(arr[ind],arr[i]); } return ; } int main() { int a[10]={4,3,1,9,8,7,2}; select_sort(a,0,6); for(int i=0;i<=6;i++)cout<<a[i]<<' '; }
二.归并排序:
#include <stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> void Merge(int *arr,int l,int r){ if(l<r){ int mid=(l+r)/2; Merge(arr,l,mid); Merge(arr,mid,r); int p1=l,p2=mid,k=0; int *temp=malloc(sizeof (int)*(r-l)); while(p1<mid||p2<r){ if(p2==r||(p1<mid&&arr[p1]<=arr[p2]))temp[k++]=arr[p1++]; else temp[k++]=arr[p2++]; } for(int i=l;i<r;i++)arr[i]=temp[i-l]; free(temp); return; } } int main(){ int a[10]={5,3,2,1,9,7,6,0,0,0}; Merge(a,0,6); for(int i=0;i<7;i++)printf("%d",a[i]); return 0; }
三.递归函数的设计:
1.确定函数设计的语义(解释)
2.确定边界条件(类似数学归纳法的f(0))
3.找到递归的关系(f(k)-->f(k+1))
四.顺序结构1:顺序表
#include <stdio.h> #include<stdlib.h> typedef struct vector{ int size;int count; int *data; }vector; vector* getnewvector(int n){ vector *p=(vector*)malloc(sizeof(vector)); p->count=0; p->size=n; p->data=(int*)malloc(sizeof(int)*n); return p; } int add(vector*p){ if(p==NULL)return 0; int*a= (int *)realloc(p->data,p->size*sizeof(int)*2); if(a==NULL)return 0; p->data=a;p->size*=2;return 1; } int insect(vector *p,int pos,int val){ if(pos<0||pos>p->count)return 0; if((p->count==p->size)&&!add(p))return 0; for(int i=p->count-1;i>=pos;i--)p->data[i+1]=p->data[i]; p->data[pos]=val; p->count +=1; return 1; } int erase(vector *k,int pos){ if(pos<0||pos>=k->count)return 0; for(int i=pos;i<=k->count-1;i++)k->data[i]=k->data[i+1]; k->count--; return 1; } void clear(vector* k){ if(k==NULL)return; free(k->data); free(k); return; } void output(vector*k){ printf("\n"); int len=0; for(int i=0;i<k->count;i++)len+=printf("%3d",i); printf("\n"); for(int i=0;i<len;i++)printf("-"); printf("\n"); for(int i=0;i<k->count;i++)printf("%3d",k->data[i]); printf("\n"); } int main(){ int n; vector*p1= getnewvector(3); for(int i=0;i<6;i++){ scanf("%d",&n); insect(p1,i,n); } output(p1); erase(p1,3); output(p1); return 0; }
五。顺序结构2.链表:
插入:先用一个指针,指向插入位置的前一个。然后再让插入元素指向下一个,再让上一个元素指向插入元素。
#include <stdio.h> #include<stdlib.h> typedef struct Node{ int data; struct Node*next; }Node;//定义结构。 Node * getNewNode(int val){ Node*p=(Node*)malloc(sizeof(Node));//先从内存空间开始创建。 p->data=val; p->next=NULL; return p;} Node * insert(Node* head,int pos,int val){ if(pos==0){ Node*p= getNewNode(val); p->next=head; return p; } Node*p=head; for(int i=1;i<pos;i++)p=p->next; Node*node= getNewNode(val); node->next=p->next; p->next=node; return head; } void clear(Node*head){//传入链表头地址; if(head==NULL)return; for(Node*p=head,*q;p;p=q){ q=p->next; free(p); } } void output(Node*head){ int n=0; for(Node*p=head;p;p=p->next)n++; for(int i=0;i<n;i++){ printf("%3d",i); printf(" "); } printf("\n"); for(Node*p=head;p;p=p->next){ printf("%3d",p->data); printf("->"); } printf("\n"); printf("\n"); } int main(){ int add; Node*head=NULL; for(int i=0;i<5;i++){ scanf("%d",&add); head=insert(head,i,add); output(head); } return 0; }