算法/***冒泡算法思想:两个泡泡,大的在后面,小的在后面***/#include<stdio.h>void bubble(int a[],int n){int temp=0;int lastexchange=0; /***传递边界***/int border=n-1;for(int i=0;i<n-1;i++){bool sort=true;for(int j=0;j<border;j++){if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;sort=false; /***两两交换,还得工作***/lastexchange=j; /***新的边界,解决了不在遍历全部元素,而是从最后交换那个位置开始***/}}border=lastexchange; /***给它新的边界***/if(sort) /***sort==trune才做,每一轮循环如果有交换用里面的false,如果哪一次循环一次都没有交换那么就不会执行交换,用外面的true,就退出循环***/{break;}}}int main(){int a[10],i;printf("请输入10个整数:\n");for(i=0;i<10;i++){scanf("%d",&a[i]);}bubble(a,10);printf("bubble后:\n");for(i=0;i<10;i++){printf("%4d",a[i]);}printf("\n");}/***插入排序思想:把它看作摸牌过程。
首先手里面有一张牌,所以i=1;摸第二张牌时和手里牌比较,比第一张牌小则往前,摸第二张牌,和前面两张牌比较,比他们都小则移动到最前面,剩下两张牌向后移动。
***/#include<stdio.h>void insert(int a[],int n){int temp,i,j;for(i=1;i<n;i++){temp=a[i];j=i-1;while(j>=0&&temp<a[j]) /***这里while不加花括号,也要执行下面两个语句,说明while循环按括号里的条件结束,不管下面有没有花括号***/{a[j+1]=a[j--]; /***利用j--先用后赋值的力量***/a[j+1]=temp; /***此时j--赋值了***/}}}main(){int i,a[10];printf("请输入10个整数\n");for(i=0;i<10;i++){scanf("%d",&a[i]);}printf("the array is:\n");for(i=0;i<10;i++){printf("%-4d",a[i]);}insert(a,10);printf("排序后:\n");for(i=0;i<10;i++){printf("%-4d",a[i]);}printf("\n");}/*顺序查找思想:把查找的数从头至尾***/ #include<stdio.h>int find(int *ListSep,int ListLength,int Keydata) {int temp=0;int length=ListLength;for(int i=0;i<ListLength;i++){if(ListSep[i]==Keydata)return i;}return 0;}int main(){int TestData[5]={34,67,1,47,8};int reData=find(TestData,5,47);printf("reData:%d\n",reData);return 0;}/***算法思想:分而治之,挖坑填数。
初始i=0;j=9;x=a[i]=?,由于已经将a[0]中的数保存在x中,可以理解成在数组a[0]上挖了一个坑,可以将其它数据填充到这里***/#include<stdio.h>void quick(int a[],int l,int r){if(l<r) /***全轮确保***/{int i=l,j=r,x=a[l]; /***l,r的生存期是大if结束***/while(i<j) /***确保交换到不满足条件***/{while(i<j&&a[j]>=x) /*这里的while循环,当找到a[j]<x 的数才会退出然后执行下面的if语句。
相当于从右往左推进,找到后停下退出***/j--;if(i<j) /***这里有i<j条件是预料这种情况,数组本来就排好了,j都已经指了第一个元素的位置,这时if就不用执行了***/{a[i++]=a[j]; /***i++,这里的值还是当前的,下面的i,就是赋值后的值***/}while(i<j&&a[i]<x) /***从左往右走。
***/i++;if(i<j){a[j--]=a[i];}}a[i]=x; /***把第一个坑的元素储存起来最后放到该放的位置***/quick(a,l,i-1); /***左边新组***//***此时那个标杆在中间,就不去动它了,它左边比他小,右边比它大***/quick(a,i+1,r); /***右边新组***/}}int main(){int a[10],i;printf("plese input ten number:\n");for(i=0;i<10;i++){scanf("%d",&a[i]);}quick(a,0,9);printf("快速排序的结果:\n");for(i=0;i<10;i++){printf("%4d",a[i]);}printf("\n");}/***选择排序思想:从头扫至尾,找到最小的元素,和第一个元素交换,接着找第二个小的放到第二个位置....***/#include<stdio.h>void select(int a[],int n){for(int i=0;i<n-1;i++) /***完成n-1次循环***/int index=i;int j;for(j=i+1;j<n;j++) /***在这个for循环中,通过不断交换下标找出一轮当中,数组元素最小的那个***/{if(a[j]<a[index]){index=j;}}int temp=a[index]; /***这里的index就是j的值,也就是最小元素的下标***/a[index]=a[i];a[i]=temp;}}int main(){int a[10],i;printf("请输入10个整数:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);}select(a,10);printf("after selection:\n");for(i=0;i<10;i++){printf("%4d",a[i]);}printf("\n");}/***希尔排序思想:插入排序特殊情况,和升级版。
分成一半一半的插***/#include<stdio.h>#define max 100void shell(int a[],int n){int i,j,k,temp,gap; /***这里gap=1是可以分到一个元素一组,然后比较***/for(int gap=n/2;gap>=1;gap/=2) /***这里的for循环功能是分组,gap/=2和i++一样,先用再赋值,下面都是这样***/{for(int i=0;i<gap;i++) /*这里的for是推进下标向右走1步,由于分了组,就要把左边的组的第一个与右边组第一个进行比较*/ {for(j=i+gap;j<n;j+=gap) /*这里的for来进行判断交换的,j=i+gap右组,j-gap左组***/{if(a[j-gap]>a[j]){temp=a[j];for(k=j-gap;k>=0&&a[k]>temp;k-=gap) /*ror,为了向左交换,这里的一个前提a[k]>temp,满足才能往左边进行交换*/a[k+gap]=a[k]; /***此时k还是j-gap的值***/ /***要先把这个for循环搞完,在弄a[k+gap]=a[k]***/a[k+gap]=temp; /***此时k的值就是k-=gap的值***/}}}}}int main(){int a[max],n,q;printf("输入数据个数\n");scanf("%d",&n);printf("输入数组元素值:\n");for(int i=0;i<n;i++)scanf("%d",&a[i]);shell(a,8);for(int i=0;i<8;i++)printf("%4d",a[i]);printf("\n");scanf("%d",&q);return 0;}/***二分查找思想:用给定值K先与中间的结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据K与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点***//*前提是有序顺序存储*/#include<stdio.h>int binsearch(int *Sep,int sepLength,int keydata){int low=0,mid,high=sepLength-1;while(low<=high) //防止一个元素都没有{mid=(low+high)/2;if(keydata<Sep[mid]){high=mid-1; //是mid-1,因为mid已经比较过了,在mdi 左边,继续细分}else if(keydata>Sep[mid]){low=mid+1;}else //说明已经找到了,不满足if ,else if 说明keydata=sep[mid]{return mid;}}return -1; //查找失败,或一个元素都没有}int main(){int a[]={1,2,3,4,5,6,7,8,9};int location;int target=4;location=binsearch(a,9,target);printf("%d\n",location);return 0;}/*基于结构体----栈的实现思路:top始终指向一个待插入的位置push操作:1.写入数据 2.top++ 3.前提:栈非满pop操作:1.top-- 2.弹出数据 3.前提:栈非空*/ #include <stdio.h>typedef struct _stack{char mem[1024];int top;}stack;int isFull(stack *ps)//判满{return ps->top == 1024;}int isEmpty(stack *ps)//判空{return ps->top == 0;}void push(stack *ps,char ch)//压栈{ps->mem[ps->top] = ch;(ps->top)++;}char pop(stack *ps) //出栈{--(ps->top);return ps->mem[ps->top];}int main(){stack s = { { 0 }, 0 };//栈初始化for (char ch = 'a'; ch <= 'z';ch++){if (!isFull(&s)){push(&s, ch);}}while (!isEmpty(&s)){putchar(pop(&s));puts("");//换行}return 0;}。